Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];

Вниз

Хочу словить сообщение от вторичного потока   Найти похожие ветки 

 
VICTOR_   (2002-10-24 22:38) [0]

В основном потоке программы создаю вторичный поток, который выполняет свою работу (напр., ищет файл на диске).
После этого основной поток должен ждать сообщения от вторичного потока про завершение выполнения работы(файл (не)найден).
После получения сообщения основной поток продолжает свою работу.
1.Как в основном потоке словить сообщение от вторичного потока?
2.Какое "безобидное" сообщение можно посылать и ловить?

Спасибо за советы и ответы.


 
[NIKEL]   (2002-10-24 23:43) [1]

Худший метод - это просто послать главному окну свое юзерское сообщение(только не надо использовать SendMessage, используй PostMessage - здесь нужна асинхронность)

Лучше делать так

Potok := TMyThread.Create(True);
//что делаем, инициализируем поток

Potok.Resume;
Potok.WaitFor;
//получаем результаты
Potok.Free;


 
VICTOR_   (2002-10-25 12:23) [2]

Посылаю сообщение из вторичного потока
PostMessage(Form1.Handle, WM_User, 0, 0);

Ловлю сообщение в главном потоке
procedure TForm1.WMUser(var Msg: TMessage);
begin
ShowMessage("Получено сообщение");
// В этом месте идет обработка искомого файла
end;

Все OK

Остался вопрос:
Как организовать цикл ожидания?:
procedure TForm1.WaitMessage;
begin
repeat
//ничего не делаю, жду сообщения
until //получено сообщение от вторичного потока
//...далее продолжаю работать
end;

Спасибо за ответы



 
Digitman   (2002-10-25 12:27) [3]

см. MsgWaitForMultipleObjects()


 
VICTOR_   (2002-10-25 13:27) [4]

>Digitman © (25.10.02 12:27)
procedure TForm1.WaitMessage;
var
outTimeOut:integer;
Result:boolean;
MyThreadHandle :THandle;
begin
MyThreadHandle := MyThread.Handle;
Result := False;
outTimeOut := 100;
while not Result do begin
Result:=MSGWAITFORMULTIPLEOBJECTS(1, MyThreadHandle, False, outTimeOut, QS_POSTMESSAGE) = (WAIT_OBJECT_0+1);
end;
//программа зависает
//если забрать цикл while, то я успешно получаю сообщение
end;

Не могу понять в чем ошибка,


 
Digitman   (2002-10-25 13:39) [5]

while not Result do begin
Result:=MSGWAITFORMULTIPLEOBJECTS(1, MyThreadHandle, False, outTimeOut, QS_POSTMESSAGE) = (WAIT_OBJECT_0+1);

переведи-ка все, что ты здесь делаешь, с Паскаля на русский
и сравни с тем, как это д.б. согласно описания ф-ции и ее параметров/результата


 
VICTOR_   (2002-10-25 13:40) [6]

Забыл добавить Aplication.ProcessMessages

while not Result do begin
Result:=MSGWAITFORMULTIPLEOBJECTS(1, MyThreadHandle, False, outTimeOut, QS_POSTMESSAGE) = (WAIT_OBJECT_0+1);
Aplication.ProcessMessages;
end;

Пока вроде работает, Всем спасибо.


 
VICTOR_   (2002-10-25 13:51) [7]

>Digitman © (25.10.02 13:39)

Спасибо за информацию, буду разбираться глубже



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.171 c
1-14568
vaneks
2002-11-27 08:49
2002.12.05
Кто знает где взять?


1-14486
Memo
2002-11-25 21:31
2002.12.05
Заставка


3-14389
iZEN
2002-11-15 12:08
2002.12.05
Компоненты ADO в консольном приложении


1-14602
Руст
2002-11-24 15:49
2002.12.05
Чтение ИНИ-файла?


3-14463
Cranium
2002-11-19 06:52
2002.12.05
Альтернатива QReport ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский