|
Вопрос # 1 920/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Работаю с потоками. Нужно, чтобы по завершении работы второго потока вызывалась процедура из главного потока приложения. При этом, чтобы второй поток не ждал завершения этой процедуры.
См. приложение.
Приложение: Переключить в обычный режим-
- procedure TForm1.Button2Click(Sender: TObject);
- var
- MyThread: TMyThread;
- begin
- MyThread := TMyThread.Create(False);
- end;
-
- procedure OnEndMyThread;
- begin
-
- end;
-
-
- procedure TMyThread.Execute;
- begin
-
-
-
- end;
 |
Вопрос задал: 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".
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|