Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2015, 09:24   #1
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
По умолчанию Поток в процедуре

Имеется код, как сделать его в потоке (procedure TForm1.WndProc)???
Код:
TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  MyThread: TMyThread;
  Form1: TForm1;
  HookEnable: Boolean = False;
  HookFilters: TMouseHookFilters;
  MWM_LBUTTONDOWN: Cardinal;
  MWM_LBUTTONUP: Cardinal;


procedure TForm1.WndProc(var Msg: TMessage);
begin
  inherited;
  if (Msg.Msg = MWM_LBUTTONDOWN) then  //кнопка нажата
  begin
     if (sRadioGroup1.ItemIndex=0) and (sComboBox1.ItemIndex=0) then
        begin
...
        end;
...
if (Msg.Msg = MWM_LBUTTONUP) then  //кнопка отжата
  begin
   ...
  Exit;
  end;

procedure TForm1.sButton1Click(Sender: TObject);
begin
  if StartMouseHook(True, Handle) = True then
    begin
    HookEnable := True;
    sButton1.Enabled := False;
    sButton2.Enabled := True;
    end else
end;

procedure TForm1.sButton2Click(Sender: TObject);
begin
  if StopMouseHook = True then
    begin
    HookEnable := False;
    sButton2.Enabled := False;
    sButton1.Enabled := True;
    end else
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if HookEnable <> False then
    StopMouseHook;
end;
пробовал добавлять в MWM_LBUTTONDOWN - MyThread:=TMyThread.Create(True); а в MWM_LBUTTONUP - MyThread.Terminate; MyThread.Free; Результат такой же, как и без них - функция выполняется до конка при клике мыши, хотя нужно, что бы при отпускании кнопки происходила полная остановка выполнения.
С потоками ни разу не сталкивался, извините за нубство

Собственно суть в том, что бы при нажатии кнопки мыши создавался поток, а при отжатии - "разрушался".
vers0 вне форума Ответить с цитированием
Старый 16.08.2015, 12:32   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

А зачем WndProc? У формы есть свои события обработки (если, конечно, не требуется все контролы контролировать)
Цитата:
Сообщение от vers0 Посмотреть сообщение
полная остановка выполнения
При нажатии старт, при отжатии - финиш? Можно в заморозку отправить suspend-ом, а потом разморозить resume. Правда, методы deprecated, но если поток не синхронизируется, то это безопасно. Это если не нужно сбрасывать состояние потока в начальное положение.
Не знаю как устроена процедура TMyThread.Execute, но я бы добавил туда проверку на флаг завершения (если это возможно).
Собственно ничего не скажу, т.к. не знаю для чего это нужно и как выглядит.
eoln вне форума Ответить с цитированием
Старый 16.08.2015, 15:39   #3
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
А зачем WndProc? У формы есть свои события обработки (если, конечно, не требуется все контролы контролировать)
Не знаю как устроена процедура TMyThread.Execute, но я бы добавил туда проверку на флаг завершения (если это возможно).
Собственно ничего не скажу, т.к. не знаю для чего это нужно и как выглядит.
Отлавливается нажатие клавиш и кнопок мыши в других приложениях (DirectX), при отжатии кнопки мыши нужно прекратить выполнение, а при повторном нажатии снова начать выполнение. Приложение свернуто в трей и по сути с главной формой нет смысла работать.
vers0 вне форума Ответить с цитированием
Старый 16.08.2015, 16:14   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Подробности засекречены? Как прекратить? Мгновенно? А если там кэш на диск сбрасывается или ещё чего опасного. Или дать доработать текущей итерации? Или там нет итераций? А как долго поток обрабатывает клик? А если пользователь очень много кликает это же нагрузка на каждое создание/удаление "тяжёлого" TThread.

Собственно, в классе завести публичную переменную IsWork. При нажатии кнопки ставить её в true, а при отжатии в false. А поток пусть выполняет то что нужно если IsWork = true. Этот способ хорош, если есть цикличность

Чтобы не было зря потраченных ресурсов (это немного гуманнее) можно использовать семафоры (мьютексы, критические секции и им подобное) для временной блокировки потока в нужном месте. Этот способ не остановит поток мгновенно, остановка только в определённых местах.

Если поток "изолирован" от других потоков, то те же suspend/resume сгодятся.

Если поток надо резко выключить, то надо пересмотреть алгоритм, потому что так делать можно, но неправильно.
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисление в процедуре desnet Паскаль, Turbo Pascal, PascalABC.NET 1 06.05.2012 17:23
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Процедура в процедуре. Annonim Паскаль, Turbo Pascal, PascalABC.NET 4 26.08.2011 16:32
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Закрытие в процедуре. segail Microsoft Office Excel 4 17.03.2010 17:16