eCo Software Developer Connection


About DevCon
Subscription to DevCon
Budget of DevCon
FAQ


Roadmap
eCo Software runtime
eCo Software toolkit
Contacts

Section 1: Start point

Section 2: Examples of WPS programs

  • There are examples in Toolkit → SAMPLES\WPS\
  • XWorkPlace – Extended classes of eComStation WPS which improve and simplify control over the operating system.

Section 3: How to compile?

Use IBM Visual Age compiler to create WPS applications and dlls. Don't use Watcom or GCC.

Section 4: WPS Guidelines

Разработка разных WPS Setup'ов

Есть проблема:

  • OK: Корзина, LMouseButton ⇒ вьювер; RMouseButton → Свойства → возможность настроить = ОК
  • OK: Электропитание, LMouseButton ⇒ вьювер; RMouseButton → Настройка = ОК
  • ПРОБЛЕМА: Экран, LMouseButton ⇒ ?! настройка.. RMB ⇒ опять настройка

Предлагается решение:

  • Все-таки LBM ⇒ вьювер. RMB → Properties ⇒ настройки. КРОМЕ ТОГО, делать кнопку “Настройка” в вьюверах!
  • Пример: Объект “Экран” поправить, LMB ⇒ показывать уменьшенную копию рабочего стола, рядом кнопка “Настройка” (иначе пользователи не найдут Настройки)
  • Пример: Добавить кнопку “Настройка” в вьювере Power Panel

Section 5: Tips and tricks

Advice 1:

Don't try this at home! - Adventures in WPS programming (Chris Wohlgemuth, netlabs.org)

The Workplace Shell is a fascinating framework albeit with some rough edges. This presentation is not a HelloWorld-WPS-class-creation-in-10-easy-steps-hands-on-workshop. It features general hints, tips, tricks and workarounds for common problems. When traveling WPS land every developer may come to some obscure places where weird stuff is waiting for the innocent. Take the information given as your personal survival guide helping to get back home safely.

Advice 2:

Проблема в вашей WPS-программе: WPS виснет при закрытии системы; WPS виснет при старте/остановке программы.

Обратите внимание на механизм мутексов в WPS, SMP.

В WPS есть внутренний механизм мутексов. Для каждого объекта создаётся мутекс. Те функции, которые что-то меняют в данных объекта, занимают этот мутекс, а после того, как произведут изменения - освобождают его. Так вот: большинство этих функций занимают мутекс, указав INDEFINITE_WAIT, так что, если данная функция вызывается во время исполнения другой функции, которая заняла данный мутекс и ждёт завершения этой функции, мы имеем мёртвый вис всего WPS. Такое происходит, например, в момент открытия/закрытия некоторых объектов, например когда происходит запуск или завершение программы. Причём, занимается мутекс, не самого объекта, а объекта того исполнимого файла, который запускает объект-программа. Также странно ведёт себя объект WorkFrame V3 Project (проект ViasualAge C++ 3.0).

Теперь, если во время выполнения данного метода бкдет вызван другой метод, который тоже займёт мутекс, причём сделает это из другого треда (следует помнить что WPS - мультитредовое приложение и треды плодит по каждому чиху), мы получим мёртвый вис WPS, т. к. мутекс уже занят данным тредом, и освобаждать мы его не собираемся, пока не выполнится тот самый метод, который мы только что вызвали. Таким методом может быть например, метод wpQueryProgDetails объекта WPProgram.

В случае, если удаётся выяснить, какой-же метод занимает мутекс, можно попытаться организовать работу так, чтобы не вызывать этот метод тогда, когда мутекс занят. Однако, бывают случаи, когда установить это довольно сложно, поскольку в SOM всё это организовано довольно непрозрачно.

Наиболее простой способ заткнуть данное место, вставив в начале того метода, внутри которого происходит зависание, проверку, занят ли мутекс данным тредом. В случае, если да - смело продолжать работу, а в случае, если нет - попытаться занять мутекс. Но пытаться занять его не до бесконечности, а например, в течение 100мс. Если не удалось - просто вернуть ошибку. Если же удалось - не забыть освободить занятый мутекс. Таким образом, объект будет в некоторых случаях выдавать ошибку (или как-то не так отрабатывать), но по крайней мере, не будет намертво вешать WPS!

Если кто-то знает способ определить, в каком методе происходит зависание (если этот метод не перекрыт и не вызывается явно) - поделитесь своими мыслями!

(thx Capricorn)

Section 6: WPS + PM

В: Как открыть на рабочем столе WPS-папку с каталогом X?

О: Используйте такой шаблон:

#define ICNL_WINWORKPLACE
 
#ifndef OPEN_DEFAULT
#define OPEN_DEFAULT 0
#endif
 
void openDownloadFolder(char *dDir)
{
    HOBJECT obj;
 
 
    if ( ( obj = WinQueryObject( dDir ) ) != NULLHANDLE ) {
      WinOpenObject( obj , OPEN_DEFAULT , TRUE );
      // Второй раз чтоб сделать открытую папку активной
      WinOpenObject( obj , OPEN_DEFAULT , TRUE );
   }
}

В: Использование WPS-классов из PM-приложения

Использование классов WPS из другого процесса возможно двумя способами:

  • С помощью DSOM
  • С помощью RWS

В: Как запустить вьювер для файла X?

A: В принципе, можно создать в папке nowhere временный объект и запустить его.

 
en/tutorials_troubleshooting.txt · Last modified: 2009/10/25 12:44 (external edit)

 
Recent changes RSS feed
© 2001 - 2009 eCo Software, All rights reserved