Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 920

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты!
Работаю с потоками. Нужно, чтобы по завершении работы второго потока вызывалась процедура из главного потока приложения. При этом, чтобы второй поток не ждал завершения этой процедуры.
См. приложение.

Приложение:
  1.  
  2. procedure TForm1.Button2Click(Sender: TObject);
  3. var
  4. MyThread: TMyThread;
  5. begin
  6. MyThread := TMyThread.Create(False);
  7. end;
  8.  
  9. procedure OnEndMyThread;
  10. begin
  11.  
  12. end;
  13.  
  14.  
  15. procedure TMyThread.Execute;
  16. begin
  17.  
  18.  
  19.  
  20. end;


prgd7 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: prgd7 (статус: Посетитель)
Вопрос отправлен: 20 сентября 2008, 17:15
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, prgd7!
Я знаю один рабочий, надёжный метод. Через посылку сообщений. Вся идея в следующем. Потоку надо передать хендл окна (обычно - главной формы - Form1.Handle). Когда поток Решит, что пора главному потоку обработать что-то, он делает посылку сообщения, где то так

PostMessage(Handle, WM_USER, 0, 0);
Эта посылка не есть синхронной и поток не будет ждать, пока главный её обработает. Сам поток при этом может завершать свою работу или продолжать дальнейшую. Можно послать и SendMessage, но в этом случае возврат с этой процедуры будет только тогда, когда главный поток полностью обработает запрос.
Параметры.
Handle - это хендл окна, которому посылается сообщение.
WM_USER - константа, которая предназначена для пользовательских сообщений. Если одной недостаточно, можно обявить себе ещё несколько в виде const WM_MYMESS = WM_USER+1; ( и 2, 3....).
два нуля в вызове - это два целочисленных параметра, их можно задавать по собственному усмотрению и передавать через них дополнительную информацию (при определённой сноровке можно передавать указатели на структуры, объекты и так дальше).
Теперь задача - научить главное окно ловить эти сообщения. Для этого идём в объявление главной формы и под словом private пишем такое
procedure MyMess(var msg:TMessage); message WM_USER;
дальше жмем Ctrl+Shif+C и делфи делает заготовку процедуры. Вот и всё. Тут можно писать код. А два переданных параметра храняться в
msg.WParam и msg.LParam (посмотрите внимательный описание postMessage, что бы понять их порядок).

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 20 сентября 2008, 18:40
Оценка за ответ: 5

Комментарий к оценке: Очень подробно и ясно описано именно о том, о чем надо. Проверил, все работает! + узнал об интересной комбинации "Ctrl+Shif+C".

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.02 сек.