У меня есть очень старый код (15 + год), который использовался для запуска нормально, на более старых машинах с более старыми версиями программного обеспечения. Теперь это не так хорошо, потому что, если не выполняется условие гонки. Это общий вопрос: скажите мне, почему я должен был знать, и ожидали, что сбой в этом коде, так что я могу распознать рисунок в другом коде:Delphi 7, Windows 7, обработчик событий, код перезапуска
procedure TMainform.portset(iComNumber:word);
begin
windows.outputdebugstring(pchar('portset ' + inttostr(icomnumber)));
with mainform.comport do
try
if open then open := False; // close port
comnumber:=iComNumber;
baud:=baudrate[baudbox.itemindex];
parity:=pNone;
databits:=8;
stopbits:=1;
open:=true;
flushinbuffer;
flushoutbuffer;
if open then mainform.statusb.Panels[5].text:=st[1,langnum] {Port open}
else mainform.statusb.Panels[5].text:=st[2,langnum]; {port set OK}
except
on E: exception do begin
windows.OutputDebugString('exception in portset');
mainform.statusb.Panels[5].text:=st[3,langnum];
beep;
beep;
end;
end;
windows.outputdebugstring('portset exit');
end;
Заметим, что flushinbuffer защищен EnterCriticalSection(); AFAIK Ничто другое не защищено, и AFAIK нет секций обработки сообщений. BUT
Когда этот код вызывается из события click, он проходит частично, а затем прерывается событием paint.
Единственная трассировка, которую я сделал, это outputdebugstring. Я могу видеть, что первая строка повторяется при вводе до того, как вторая строка будет показана при выходе. Это реально, или это иллюзия?
Трассировка выглядит следующим образом:
4.2595 [4680] graph form click event
4.2602 [4680] portset 1 'from click event handler'
4.2606 [4680] graph form paint event
4.2608 [4680] portset 1 'from paint event handler'
4.2609 [4680] portset exit
4.3373 [4680] portset exit
Это состояние гонки: краски обработчики события формы вызываются до обработчика событий клика кода заканчивается, что вызывает сбои. Серийный код - AsyncPro. Нет кода нити. Да, есть больше кода, нет, это не ничего особенного делать до «1 подмножестве портов», но это написать в форме, прежде чем он получает там:
with graphform do begin
if not waitlab.Visible then begin
waitlab.visible:=true;
waitprogress.position:=0;
waitprogress.visible:=true;
waitprogress.max:=214;
end;
end;
mainform.Statusb.panels[5].text:=gcap[10,langnum];
Не сдерживайте: Что она делает неправильно, что я должен искать?
Что такое «событие краски»? И что такое стек вызовов внутри этого события? Весь код работает на потоке gui? –
И что-нибудь вызывает ProcessMessages? –
@DavidHeffernan Просто мысль, но как вы думаете, это может быть изменение в Windows API за последние 15 лет? Принятые с тех пор меры безопасности ОС могут изменить модель потоков, под которой выполняются определенные функции. Просто удар в темноте ... – Sam