簡體   English   中英

如何在后台線程中運行 DB 操作時同步 Delphi 事件?

[英]How to sync Delphi event while running DB operations in a background thread?

使用 Delphi 7 和 UIB,我在后台線程中運行數據庫操作以消除以下問題:

  • 暫停
  • 優先
  • 網絡丟失后立即強制重新連接
  • 非阻塞用戶界面
  • 保持打開的數據庫連接處於活動狀態
  • 用戶取消

我在這里閱讀了所有相關主題,並意識到:使用while isMyThreadStillRuning and not UserCanceled do sleep(100); end; while isMyThreadStillRuning and not UserCanceled do sleep(100); end; 不是推薦的方法,而是使用TEvent.WaitFor(3000)...
這里的解決方案要么是發送信號 FROM 或TO...線程,要么是使用 messages ,但絕不是兩種方式。

閱讀幫助文件,我還發現TSimpleEvent ,它似乎更易於使用。

那么在 Main-UI + DB-Thread 這兩種方式之間進行通信的推薦方式是什么?

我應該簡單地創建 2+2 TSimpleEvent嗎?

  • 開始一個新事務(線程應該停止睡眠)
  • 強制停止執行
  • 如果它移動到一個新的階段(事務開始/執行/提交=完成)發出信號
  • 如果發生任何錯誤,則返回信號

還是應該只有 1 個TEvent

更新 2:
第一次測試顯示:

  • 2x TSimpleEvent就足夠了(1 用於 Thread + 1 用於 Gui)
  • 兩者都創建為后台線程的公共屬性
  • 強制終止線程不起作用。 (太多錯誤無法處理..)
  • 最好設置一個像 (Stop_yourself) 這樣的變量,讓它取消並釋放自己, (同時從同一個 class 創建一個新實例,然后重試。)
  • (仍在進行中……)

您應該將查詢移動到TThread 不幸的是,匿名線程在 D7 中不可用,因此您需要編寫自己的TThread派生 class。 在里面,你需要它自己的數據庫連接來防止共享資源。 在調用者方法中,您可以等待線程結束。 結果應存儲在調用方 class 中的某處。 確保使用 TMutex 或 TMonitor 對查詢參數的訪問和存儲查詢結果的訪問是線程安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM