Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизОбращение к форме внутри потока Найти похожие ветки
← →
Новичоккк (2006-10-03 14:47) [0]Я создаю поток с помощью CreateThread:
createthread(nil, 0, @MyThread, nil, 0, ht);
Вот процедура MyThread:procedure MyThread;
begin
while true do with frmMain do
begin
if lCS.Caption<>"ACTIVE" then
begin
lCS.Caption:="ACTIVE";
//lCS.Font.Style:=[fsBold];
end;
if lCS.Font.Color=clGreen then
lCS.Font.Color:=clWindowText
else lCS.Font.Color:=clGreen;
sleep(100);
end;
end;
Почему, если убрать комментарий со строки:lCS.Font.Style:=[fsBold];
программа при запуске зависает?
← →
Игорь Шевченко © (2006-10-03 14:49) [1]
> Я создаю поток с помощью CreateThread:
Надо создавать поток с помощью BeginThread
> Вот процедура MyThread:
> procedure MyThread;
> begin
> while true do with frmMain do
> begin
Внутри потоков нельзя обращаться к формам и их свойствам.
← →
Ketmar © (2006-10-03 15:11) [2]>[1] Игорь Шевченко(c) 3-Oct-2006, 14:49
>Внутри потоков нельзя обращаться к формам и их
>свойствам.
можно. но очень осторожно. %-)
← →
Игорь Шевченко © (2006-10-03 15:49) [3]Ketmar © (03.10.06 15:11) [2]
Если времени много, то можно.
← →
clickmaker © (2006-10-03 16:02) [4]Через PostMessage, чтоб не иметь гемора с синхронизацией
← →
clickmaker © (2006-10-03 16:08) [5]что такое lCS - хрен его знает, но примерно так
function MyThread(Param: Pointer); Cardinal; stdcall;
begin
while not Terminated do begin
PostMessage(frmMain.Handle, WM_MY_MESSAGE, 0, 0);
sleep(100);
end;
Result := 0;
end;
type TMyForm
...
procedure WMMyMessage(var Msg: TMessage); message WM_MY_MESSAGE;
...
procedure TMyForm.WMMyMessage(var Msg: TMessage);
begin
if lCS.Caption<>"ACTIVE" then
begin
lCS.Caption:="ACTIVE";
lCS.Font.Style:=[fsBold];
end;
if lCS.Font.Color=clGreen then
lCS.Font.Color:=clWindowText
else
lCS.Font.Color:=clGreen;
end;
← →
Новичоккк (2006-10-03 18:23) [6]2 clickmaker
Спасибо за Ваш ответ. У меня возникло два вопроса.
1. Необходимо объявить константу WM_MY_MESSAGE? Если да, то какое значение указать?
2. При вызове PostMessage поток приостановится на момент выполнения TMyForm.WMMyMessage?
← →
Джо © (2006-10-03 18:28) [7]> [6] Новичоккк (03.10.06 18:23)
> 1. Необходимо объявить константу WM_MY_MESSAGE? Если да,
> то какое значение указать?
WM_USER + произвольное значение, например 666 :)
> 2. При вызове PostMessage поток приостановится на момент
> выполнения TMyForm.WMMyMessage?
Что-то вроде того :)
← →
Leonid Troyanovsky © (2006-10-04 07:06) [8]
> Новичоккк (03.10.06 18:23) [6]
> 2. При вызове PostMessage поток приостановится на момент
> выполнения TMyForm.WMMyMessage?
При SendMessage - приостановится.
--
Regards, LVT.
← →
clickmaker © (2006-10-04 09:46) [9]
> При вызове PostMessage поток приостановится на момент выполнения
> TMyForm.WMMyMessage?
нет. Она сунет сообщение в очередь и отвалит.
Но для критических случаев, когда требуется немедленная реакция, это может не подойти
← →
Новичоккк (2006-10-04 09:57) [10]2Джо
Другие мастера с вами не согласны ;)
---
Мне необходима именно мгновенная реакция с приостановкой потока.
Значит вместо PostMessage использовать SendMessage?
← →
Новичоккк (2006-10-04 10:01) [11]Нде. Около пяти часов искал ошибки в коде, а оказалось, что ошибкой было использование PostMessage... По крайней мере за 5 минут теста всё работает идеально.
← →
Leonid Troyanovsky © (2006-10-04 13:30) [12]
> Новичоккк (04.10.06 09:57) [10]
> 2Джо
> Другие мастера с вами не согласны ;)
Я, например, не возразил против "вроде того"
(возможно на однопроцессорной системе).
Т.е., многое зависит от интерпретации
"поток приостановится на момент выполнения"
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c