Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Опросить клавиатуру из потока для своего приложения / 9 сообщений из 9, страница 1 из 1
27.11.2018, 15:07
    #39739175
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
Иногда приходится запускать скрипты типа PascalScript и в некоторых ситуациях случается, что они зависают. Придумал "умный" способ их останавливать - опрашивать клавиатуру на нажатие Escape.
Что-то вроде:
Код: pascal
1.
2.
3.
4.
5.
6.
  while not Thread.Terminated do
  begin
    if (GetAsyncKeyState(VK_ESCAPE) <> 0) then
      Script.Stopped := true;
    sleep(250);
  end;


Всё работает почти классно, но нажатие Escape останавливает скрипт, даже если приложение, где запущен скрипт, не активное. Как можно из потока безопасно определить, что твоё приложение активно?
...
Рейтинг: 0 / 0
27.11.2018, 15:10
    #39739179
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
Dimonka,

Как вариант навесить обработчик Application.OnMessage и там проверять WM_KEYDOWN с VK_ESCAPE.
...
Рейтинг: 0 / 0
27.11.2018, 15:11
    #39739180
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
alekcvpDimonka,

Как вариант навесить обработчик Application.OnMessage и там проверять WM_KEYDOWN с VK_ESCAPE.
Вариант не очень. Добавляю условие - скрипт выполняется в главном потоке и может повесить его наглухо.
...
Рейтинг: 0 / 0
27.11.2018, 15:16
    #39739184
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
DimonkaalekcvpDimonka,
Как вариант навесить обработчик Application.OnMessage и там проверять WM_KEYDOWN с VK_ESCAPE.
Вариант не очень. Добавляю условие - скрипт выполняется в главном потоке и может повесить его наглухо.
ИМХО, логичнее было бы наоборот - скрипт в потоке, а всё остальное - из главного.

Ну тогда: GetForegroundWindow , GetCurrentProcessId и GetWindowThreadProcessId .
...
Рейтинг: 0 / 0
27.11.2018, 15:17
    #39739187
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
Правда я не на 100% уверен, что их можно вызывать не из GUI-потока.
...
Рейтинг: 0 / 0
27.11.2018, 16:13
    #39739220
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
Если действительно никак нельзя переместить выполнение скрипта в доп поток, то можно сделать доп поток-контролёр. В нём создавать окно (на winapi, т.к. VCL-ную форму вызвать из доп потока - проктология высшего разряда) с кнопкой Стоп. Чтобы не морочиться с конструкцией окна функциями, можно подгружать его из ресурсов диалогов, это намного проще. Так будет более солидно (юзер увидит, что прога его не покинула, уйдя в нирвану) и понятно (откуда ему знать, что нужно нажать Escape).
...
Рейтинг: 0 / 0
27.11.2018, 17:26
    #39739286
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
[quot alekcvp]Dimonkaпропущено...ИМХО, логичнее было бы наоборот - скрипт в потоке, а всё остальное - из главного.Тогда скрипт синхронизировать с GUI замучаешься
alekcvpНу тогда: GetForegroundWindow , GetCurrentProcessId и GetWindowThreadProcessId . Вот так хорошо - мне нравится.
...
Рейтинг: 0 / 0
27.11.2018, 19:32
    #39739363
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
DimonkaТогда скрипт синхронизировать с GUI замучаешься
А сейчас, я смотрю, всё легко и приятно, а, главное, UI - отзывчивый
Там через PostMessage() можно или через Synchronize().
...
Рейтинг: 0 / 0
27.11.2018, 20:26
    #39739380
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опросить клавиатуру из потока для своего приложения
alekcvpDimonkaТогда скрипт синхронизировать с GUI замучаешься
А сейчас, я смотрю, всё легко и приятно, а, главное, UI - отзывчивый
Там через PostMessage() можно или через Synchronize(). Сейчас всё легко и приятно. И даже UI отзывчивый. Конечно можно и накосячить, но при желании теперь можно в любой момент скрипт остановить, а это уже плюс.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Опросить клавиатуру из потока для своего приложения / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]