使用德爾福 10.4
使用工具 REST Debugger,稱為 API,并獲得組件。
呼叫組件
begin
writeln('starting');
RESTRequest1.Execute; writeln('finieshed 1');
RESTRequest2.Execute; writeln('finieshed 2');
RESTRequest3.Execute; writeln('finieshed 3');
writeln('Done.');
end;
當我除錯代碼時
在執行中有一行
// Eventhandlers AFTER Observers
HandleEvent(DoAfterExecute);
這導致了以下程序:
class procedure TThread.Synchronize(const AThread: TThread; AMethod: TThreadMethod);
var
LSynchronize: TSynchronizeRecord;
begin
LSynchronize.Init(AThread, AMethod);
Synchronize(@LSynchronize); // <--- here
end;
和密碼鎖。
我認為它是一個死鎖,但我不知道什么被鎖定。
設定是控制臺應用程式中的一個執行緒。
Download := TDownload.Create(nil);
// Simulate service start.
Download.ServiceStart(Download, MyDummyBoolean);
readln;
// On exit, destroy the service object.
FreeAndNil(DownloadInvoices);
缺少 RestClient 的檔案。它被鎖定了什么?或如何識別鎖定程式?
uj5u.com熱心網友回復:
您的問題在于SynchronizeRTL 中的呼叫。
Synchronize當應用程式空閑(即它沒有要處理的事件)時,在主訊息回圈中被拾取。
正如您所說,這是一個控制臺應用程式,我懷疑您沒有可以注冊應用程式空閑或處理等待Synchronize呼叫的主訊息回圈。
如果你想使用呼叫的組件,那是沒有辦法的Syncronize——你必須有一個適當的訊息回圈。最簡單的方法是實作一個簡單的 VCL、FMX 或服務應用程式,然后Synchronize呼叫就會成功。
作為替代方案,您可以撰寫自己的主回圈。根據下面 Remy Lebeau 的評論,您需要CheckSynchronize()定期呼叫,并且您可以利用 RTLSyncEvent知道何時呼叫CheckSynchronize()。檔案還提到使用全域變數WakeMainThread來存盤物件方法 ( TNotifyEvent),當作業執行緒獲得主執行緒上的鎖時呼叫該方法。
由于某種原因,編輯不允許我添加鏈接。參見CheckSynchronize:https ://docwiki.embarcadero.com/Libraries/en/System.Classes.CheckSynchronize
參見SyncEvent:https ://docwiki.embarcadero.com/Libraries/en/System.Classes.SyncEvent
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/433901.html
