OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Потоки в каркасе BlackBox
СообщениеДобавлено: Суббота, 20 Февраль, 2016 05:08 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Всегда думал, что ББ работает в одном потоке Windows. Однако это не так :)
Обработка клавиатуры сделана в отдельном потоке.

Код:
   (* -------------------- keyboard interrupt handling --------------------- *)

   PROCEDURE KeyboardWatcher (main: INTEGER): INTEGER;   (* runs in a thread *)
      TYPE P = PROCEDURE(w: INTEGER): INTEGER;
      VAR res, a: INTEGER; top, h: WinApi.HANDLE; done: BOOLEAN;
         context: WinApi.CONTEXT; mod: Module; isHungAppWindow: P;
   BEGIN
      done := FALSE;
      isHungAppWindow := NIL;
      h := WinApi.LoadLibraryA("user32.dll");
      IF h # 0 THEN
         isHungAppWindow := S.VAL(P, WinApi.GetProcAddress(h, "IsHungAppWindow"))
      END;
      LOOP
         res := WinApi.GetAsyncKeyState(WinApi.VK_CANCEL);
         IF res >= 0 THEN   (* key released *)
            done := FALSE;
            WinApi.Sleep(10);
         ELSIF ~done THEN   (* key pressed *)
            top := WinApi.GetForegroundWindow();
            IF (mainWnd # top) & (isHungAppWindow # NIL)
                  & (top # 0) & (isHungAppWindow(top) # 0)
                  & (mainWnd # 0) & (isHungAppWindow(mainWnd) # 0) THEN
               (* main window replaced by ghost window *)
               (* check if application window is topmost nonresponding window *)
               REPEAT
                  top := WinApi.GetWindow(top, WinApi.GW_HWNDNEXT)
               UNTIL (top = 0) OR (isHungAppWindow(top) # 0) & (WinApi.IsWindowVisible(top) # 0)
            END;
            IF mainWnd = top THEN
               res := WinApi.SuspendThread(main);
               context.ContextFlags := {0, 16};
               res := WinApi.GetThreadContext(main, context);
               mod := modList; a := context.Eip;
               WHILE (mod # NIL) & ((a < mod.code) OR (a >= mod.code + mod.csize)) DO
                  mod := mod.next
               END;
               IF (mod # NIL) & (mod.name = "Kernel") THEN mod := NIL END;
               IF mod # NIL THEN
                  interrupted := TRUE;
                  INCL(S.VAL(SET, context.EFlags), 8);   (* set trap flag *)
                  res := WinApi.SetThreadContext(main, context);
                  done := TRUE
               END;
               res := WinApi.ResumeThread(main);
               WinApi.Sleep(1);
               interrupted := FALSE
            END
         END
      END;
      RETURN 0
   END KeyboardWatcher;

   PROCEDURE InstallKeyboardInt;
      VAR res, id: INTEGER; t, main: WinApi.HANDLE;
   BEGIN
      res := WinApi.DuplicateHandle(WinApi.GetCurrentProcess(), WinApi.GetCurrentThread(),
               WinApi.GetCurrentProcess(), main, {1, 3, 4, 16..19}, 0, {});
      t := WinApi.CreateThread(NIL, 4096, KeyboardWatcher, main, {}, id);
   END InstallKeyboardInt;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Потоки в каркасе BlackBox
СообщениеДобавлено: Суббота, 20 Февраль, 2016 15:30 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Иван Денисов писал(а):
Обработка клавиатуры сделана в отдельном потоке.
Звучит так, словно вся обработка клавиатуры в отдельном потоке. На самом деле, в отдельном потоке отлавливаеся только лишь Ctrl+Break. Это сделано на случай зависания основного потока, в котором-таки обрабатывается клавиатура, отрисовка и всё остальное.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Потоки в каркасе BlackBox
СообщениеДобавлено: Понедельник, 22 Февраль, 2016 10:54 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Александр Ильин писал(а):
Иван Денисов писал(а):
Обработка клавиатуры сделана в отдельном потоке.
Звучит так, словно вся обработка клавиатуры в отдельном потоке. На самом деле, в отдельном потоке отлавливаеся только лишь Ctrl+Break. Это сделано на случай зависания основного потока, в котором-таки обрабатывается клавиатура, отрисовка и всё остальное.

Спасибо за пояснение, Александр. Не обратил на это внимание...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB