古いソフトウェア バージョンの古い遅いマシンで問題なく動作していた非常に古いコード (15 年以上) があります。if が競合状態に失敗するため、現在はうまく機能しません。これは一般的な質問です。他のコードのパターンを認識できるように、このコードの失敗を知って予測する必要があった理由を教えてください。
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() で保護されていることに注意してください。私の知る限り、他に保護されているものはありません。私の知る限り、メッセージ処理セクションはありません。しかし
このコードがクリック イベントから呼び出されると、途中で取得されてから、ペイント イベントによって中断されます。
私が行った唯一のトレースは、outputdebugstring を使用したものです。2 番目の文字列が終了時に表示される前に、最初の文字列が開始時に繰り返されていることがわかります。それは本当ですか、それとも幻想ですか?
トレースは次のようになります。
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];
躊躇しないでください: 何が間違っているのでしょうか? 何を調べればよいでしょうか?