![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ProcessMessages [D6, D7, NT4, WinXP]
dmirror © (2006-10-31 14:08:00)В чистом приложении вызов Application.processmessages работает.
Создаю поток
type
TServiceThread = class(TThread)
public
procedure Execute; override;
end;
---
var
ServiceThread: TServiceThread;
и на processmessages компилятор начинает ругаться что не видит такой функции.
что может быть и как исправить?
Игорь Шевченко (2006-11-01 17:06:00) [41]@!!ex © (01.11.06 16:58) [48]
> Собственно никто не обещает, что при проверке второй части
> условия форма все еще будет не Nil. :))
А собственно, посмотреть, при каких условиях она станет nil при проверке второго условия ?
Anatoly Podgoretsky (2006-11-01 17:04:00) [42]> @!!ex (01.11.2006 16:58:48) [48]
Это первая проблема, а вторая никто не гарантирую, что не будут вычисляться
обе части выражения, первая безопасная, а по второй имеется счастье получить
AV по полной программе. Зависит от настроек компилятора.
Помню как кто то очень громко ругался на форумах :-)
@!!ex (2006-11-01 16:58:00) [43]
> YuRock © (01.11.06 16:26) [46]
Собственно никто не обещает, что при проверке второй части условия форма все еще будет не Nil. :))
Anatoly Podgoretsky (2006-11-01 16:51:00) [44]> YuRock (01.11.2006 16:26:46) [46]
Например между первой и второй перерывчик небольшой.
YuRock (2006-11-01 16:26:00) [45]
> А ты много такого видел, откуда тогда берутся AV?
Нет, немного. Я видел только один случай, откуда берутся AV: когда обращаются к адресу памяти, доступа к которому нет.
Anatoly Podgoretsky (2006-11-01 16:21:00) [46]> YuRock (01.11.2006 16:08:44) [44]
> а голова программеру на что
А ты много такого видел, откуда тогда берутся AV?
YuRock (2006-11-01 16:08:00) [47]
> Anatoly Podgoretsky © (01.11.06 15:47) [43]
> За то есть обращение
> к непринадлежащей тебе памяти. Между первой и второйперерывчик
> не большой, во время которого второй поток уже уничтожил
> объект -тут нужна критическая секция.
Блин, а голова программеру на что? Естественно, что пользоваться средствами, предоставленными Борландом, Майкрософтом и т.д. надо с умом! В этом случае, например, если используешь Application.ProcessMessages для выкрутки сообщений другого потока, надо знать, что желательно поток-то этот закрыть вообще нафиг, перед тем, как MainForm уничтожится (если она была вообще, конечно).
> Eraser © (01.11.06 15:24) [40]
> (MainForm.FormStyle = fsMDIForm)кстати подобных конструкций
> тоже стараюсь избегать.. в отличие от борланада ) хотя они
> если и поменяют работу компилятора - первые об этом узнают
> и перепишут код, а вот мне искать внезапно-появившиеся ошибки,
> при переходе на новую версию компилятора, в проекте на
> несколько десятков тысяч строк не хочется.
А с этим кодом что плохого? И при чем тут компилятор?
Anatoly Podgoretsky (2006-11-01 15:47:00) [48]> Eraser (01.11.2006 15:25:41) [41]
За то есть обращение к непринадлежащей тебе памяти. Между первой и второй
перерывчик не большой, во время которого второй поток уже уничтожил объект -
тут нужна критическая секция.
Anatoly Podgoretsky (2006-11-01 15:45:00) [49]> Eraser (01.11.2006 15:24:40) [40]
Да код не безобидный даже и без потоков, легко получить не то что задумал.
Но это уже много раз разжевывалось.
Eraser (2006-11-01 15:25:00) [50]> [39] Anatoly Podgoretsky © (01.11.06 15:23)
ну записи то там нет.
Eraser (2006-11-01 15:24:00) [51]> [37] YuRock © (01.11.06 15:17)
> (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm)
кстати подобных конструкций тоже стараюсь избегать.. в отличие от борланада ) хотя они если и поменяют работу компилятора - первые об этом узнают и перепишут код, а вот мне искать внезапно-появившиеся ошибки, при переходе на новую версию компилятора, в проекте на несколько десятков тысяч строк не хочется.
Anatoly Podgoretsky (2006-11-01 15:23:00) [52]> Eraser (01.11.2006 15:20:38) [38]
> (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm)
С потоками, я бы не назвал это код безобидным, легко получить как минимум AV
Это не атомарная операция.
Eraser (2006-11-01 15:20:00) [53]> [33] Игорь Шевченко © (01.11.06 10:53)
мда.. насчет AV в (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm) эт я погорячился, не учел тот факт, что форма не уничтожается, когда заканчивается Run. Но сути дела это не меняет. Я б не стал использовать методы TApplication для обработки сообщений в доп. потоке.
YuRock (2006-11-01 15:17:00) [54]
> ощущени, что вы с потоками не работали....В курсе, что будет
> если к одной переменной одновременно обратяться из двух
> разных потоков?Семафоры и мьютексы не просто так придумали.
>
Да, знаю. В худшем случае - логические ошибки. Которые, конечно, могут повлечь за собой все, что угодно. А могут и не повлечь, как в случае с безобидным сравнение двух чисел:
if (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm)
Сергей М. (2006-11-01 13:30:00) [55]
> нужно было убить библиотеку svcmgr
А как она у тебя оказалась в проекте обычного GUI-приложения ?
dmirror (2006-11-01 11:58:00) [56]ProcessMessagess запускается в основной программе а не в потоке, в потоке обслуживается генераторно-осцилографическая часть. А ProcessMessagess нужен для отслеживания событий системы позиционирования, просто без него не могу получить сигнал готовности.
Код слующий
procedure TForm1.ScanStartClick(Sender: TObject);
var
i,j : integer;
sx,sy,vx,vy : string;
uclen, k,h : integer;
temp : real;
begin
vx := Edit16.Text;
vy := Edit17.Text;
sx := Edit18.Text;
sy := Edit19.Text;
Stringcounter :=1;
IsFastScan:=true;
cRecBufSizeMaxF:=trunc(cSamplPS*StrToInt(sx)/StrToInt(vx));
cRecBufSizeMaxFBin:=(cRecBufSizeMaxF - (cRecBufSizeMaxF mod 2))*2;
for i:=1 to StrToInt(numlines.Text) do
begin
sleep(200);
isReady :=false;
cport.WriteStr('@0A 0,5000,'+sy+','+vy+#13#10);
start;
j:=0;
repeat
inc(j);
application.ProcessMessages();
until IsReady;{ or (j>=15);
if (j>=15) then begin
ShowMessage('Каретка не дошла до конца');
end; }
sleep(200);
isReady :=false;
Cport.WriteStr('@0A 0,5000,'+'-'+sy+','+vy+#13#10);
repeat
application.ProcessMessages();
until isReady = true;
sleep(200);
isReady :=false;
Cport.WriteStr('@0A'+sx+','+vx+',0,5000'+#13#10);
repeat
stringcounter:=Stringcounter+1;
application.ProcessMessages();
until isReady;
end;
IsFastScan:=false;
end;
А ларчик открывался достаточно просто - нужно было убить библиотеку svcmgr. После чего ProcessMessages заработал. А вот первопричина не понятна, в чистом приложении без потоков даже с svcmgr код работал
Всем спасибо!
dmirror (2006-11-01 11:58:00) [57]ProcessMessagess запускается в основной программе а не в потоке, в потоке обслуживается генераторно-осцилографическая часть. А ProcessMessagess нужен для отслеживания событий системы позиционирования, просто без него не могу получить сигнал готовности.
Код слующий
procedure TForm1.ScanStartClick(Sender: TObject);
var
i,j : integer;
sx,sy,vx,vy : string;
uclen, k,h : integer;
temp : real;
begin
vx := Edit16.Text;
vy := Edit17.Text;
sx := Edit18.Text;
sy := Edit19.Text;
Stringcounter :=1;
IsFastScan:=true;
cRecBufSizeMaxF:=trunc(cSamplPS*StrToInt(sx)/StrToInt(vx));
cRecBufSizeMaxFBin:=(cRecBufSizeMaxF - (cRecBufSizeMaxF mod 2))*2;
for i:=1 to StrToInt(numlines.Text) do
begin
sleep(200);
isReady :=false;
cport.WriteStr('@0A 0,5000,'+sy+','+vy+#13#10);
start;
j:=0;
repeat
inc(j);
application.ProcessMessages();
until IsReady;{ or (j>=15);
if (j>=15) then begin
ShowMessage('Каретка не дошла до конца');
end; }
sleep(200);
isReady :=false;
Cport.WriteStr('@0A 0,5000,'+'-'+sy+','+vy+#13#10);
repeat
application.ProcessMessages();
until isReady = true;
sleep(200);
isReady :=false;
Cport.WriteStr('@0A'+sx+','+vx+',0,5000'+#13#10);
repeat
stringcounter:=Stringcounter+1;
application.ProcessMessages();
until isReady;
end;
IsFastScan:=false;
end;
А ларчик открывался достаточно просто - нужно было убить библиотеку svcmgr. После чего ProcessMessages заработал. А вот первопричина не понятна, в чистом приложении без потоков даже с svcmgr код работал
Всем спасибо!
Игорь Шевченко (2006-11-01 10:53:00) [58]Eraser © (31.10.06 19:17) [30]
> if (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm)
property FormStyle: TFormStyle read FFormStyle
property ActiveForm: TForm read FActiveForm;
И чего ?
> при завершении приложения, если доп. поток еще будет ативен,
> в этом месте AV обязательно вылетит.
Пример не затруднит ?
Дмитрий Белькевич (2006-11-01 02:44:00) [59]Господа, вам в жизни проблем мало, что бы еще и на эти грабли наступать - в appllication.processmessage может случится многое - нажатия на кнопки, перерисовка итд. И коматоз обеспечен.
@!!ex (2006-10-31 20:46:00) [60]
> YuRock
ощущени, что вы с потоками не работали....
В курсе, что будет если к одной переменной одновременно обратяться из двух разных потоков?
Семафоры и мьютексы не просто так придумали.