:より転載https://www.cnblogs.com/lackey/p/6337357.html
VIIは:空間および時間における複数のスレッドは、それぞれのコードは、指定された時空間スレッドの実行に詰め
ADOに、例えば、一般的な方法は、ウィンドウのADO接続(又はDataModuleの)をドラッグすることで、
などAdoQuery、DataSoure、DBGridの、と相まって、あなたは、データベースへのアクセスを実現することができます。
このように、それは時間と空間内のデータベースにアクセスするためのメインスレッドとして理解することができます。
特定のクエリまたは更新操作が長い時間を要する場合には、インタフェースは、アニメーションを停止します。
スレッド1. Accessデータベースの空間と時間
実際には、上記だけでなく、メインスレッドのみが空間と時間にアクセスすることができ、このADO接続を言及しました
また、別のマルチスレッド時空間にアクセスすることができます。しかし、重要な前提があります:
つまり:アクセスADO接続にいつでも、一つのスレッドだけ!
マルチスレッド空間・時間アクセスすることができ、あなたはまた、メインスレッドの時間と空間、彼らができる代替アクセスではなく、両方にアクセスすることができます。
したがって、我々は、データベースの操作にアクセスする必要がある他のスレッドにスレッドDataThread時間と空間、時間と空間を定義することができ、
すべてはDataThread時間と空間に詰め。具体的なアプローチは、次のようにインターフェースDataThreadを設計することです:
uJooThread手段と インターフェースが 使用 クラス、uFooThread; タイプ TJooThread =クラス(TFooThread) パブリック 手順同期(AProc:TThreadMethod); END; 実施 {} TJooThread 手順TJooThread.Synchronize(AProc:TThreadMethod); 始める ExecProcInThread(AProc); //その後デザインAProc機能の結果を待ちます。 END; 終了。
データベースインタフェースは仮死状態の原因となったので、これは他のスレッドの操作がデータベースにアクセス簡素化するだけでなく、時間のかかる操作を回避するためだけではなく。
異常がデータベースにアクセスし、その後に再び動作するように発生した場合に加えて、ADO接続は、この接続も、スレッドである再作成
問題はデータベース操作を持って検討する必要はありません。以下のような:データベースにアクセスする必要が表示されない、AoConnectionケースが破損した状態です。
換言すれば、このスレッドを使用して、操作がデータベースにアクセスするためにキューイングされました。
作業者Aの定義、パラメータを取ってデータベースを起動し、計算され、その後、結果がデータベースを更新します。
10件のスレッドAのインスタンスがある場合、スレッドAがデータベースにアクセスし、DataThreadにだけ必要なアクセス操作をすることができます。
各ADO接続のためのスレッドを割り当てていない理由の友人は、いくつかの疑問である必要があります。このようなプログラミングが容易になります。
まず、データベースへの接続は、接続数がキャップされ、リソースを消費します。
第二に、各スレッドの動作は、ADO接続アクセス同じテーブル生成された場合。
そして、ロックのデータベース自体は、シリアル実行にそれらを回し、それが効率を改善しません。
データベースからパラメータを取りながら2.複数のクライアント、どのようになりますか?
このストアドプロシージャでは、各クライアントがAdoStoredProcduce(ストアドプロシージャ)によってパラメータを取得することは、我々ができ仮定すると、
(MSSQLに例えば)データベースに追加sp_getapplockクライアントが順にパラメータを取得することを可能にします。アップデートも共感します。
したがって、マルチスレッドロックを学習することも、拡張ロックデータベースによって理解することができます。
以下は、これまでのところ、このチュートリアルでは、基本的にタスクを完了し、詳細なコードです。
書かないこの例のメソッドを呼び出します。あなたはすべてのチュートリアルを読めば、あなたが書く必要があります。
あなたは、書き込みを読んでいない場合、それはどのような意味を持っていますか?オブジェクト指向の基礎をブラッシュアップしてください。
その他のチュートリアル後に、このマルチスレッドチュートリアルの基礎となっています。
uJooThread手段と インターフェースが 使用 するクラス、SyncObjs、uFooThread、uFooListと、 タイプ PSyncRec = ^ TSyncRec; TSyncRec =録音 方法,: TThreadMethod; //これはクラスメソッドである PROC:TThreadProcedure; //これは匿名の方法では、 //のみ、本実施の形態の書き込みクラスのメソッド。必要匿名メソッド、およびヘビーデューティー自己同期キュー ACシングル:にTEvent; キュー:ブール; END; コード実行するためのTSyncRecList =クラス(TFooList <PSyncRec>)//リストの手段 で保護 手順FreeItem(アイテム:PSyncRecを);オーバーライド。 END; TJooThread =クラス(TFooThread) プライベート FSyncRecList:TSyncRecList、 手順を確認し、 公衆 コンストラクタ(ACanAccessCom:Boolean)を作成します。 破壊デストラクタ;オーバーライド; 手順同期(AProc:TThreadMethod)は、AProcに//閉塞が復帰する前に終了しました。 手順キュー(AProc:TThreadMethod);詰めスレッド後、直ちに//戻ります。 エンド; この例の統合された使用は、単一の知識//の前で話すことです。 //にTEvent、FooThread、FooListは、すべて使用していました。 //そして新しいスレッド機能を構築します。 終了時//私は、システムのソースコード、見つかった 、UI操作WM_NULLメッセージを受信した後の処理//ウィンドウ関数をほぼ正確に同じ。 //違いは、本実施形態における時空スレッドはメインスレッド・システムのソース・コードは、時間である、ものです。 実装 {} TJooThread 手順TJooThread.Check; VARの P:PSyncRec; 始める FSyncRecList.Lock; //実行されるすべてのコードは、リストにあります。 //これは時空のスレッドで、それはリストからコードをフェッチし、実行することができます。 トライ P:= nilを; FSyncRecList.Count> 0その後、//リスト場合は、各撮影は、最初に行きました。 始めます P:= FSyncRecList [0]。 FSyncRecList.Delete(0)。 終わり; 最後に FSyncRecList.Unlock; 終わり; (p)を割り当てた場合、その後 始まる 割り当てられている場合(p.Method)、その後 p.Method 割り当てた場合、その後(p.Proc)他 )(p.Proc。 。そうでない場合はp.Queueその後、//如果是阻塞、就置信号 p.Signle.SetEvent。 廃棄(P)。 ExecProcInThread(チェック)。 終わり; 終わり; コンストラクタTJooThread.Create(ACanAccessCom:ブール値); 始める 継承されました。 FSyncRecList:= TSyncRecList.Create。 終わり; ベギン デストラクタTJooThread.Destroy; FSyncRecList.Add(P)。 FSyncRecList.Free; 継承されました; 終わり; 手順TJooThread.Queue(AProc:TThreadMethod)。 VARの P:PSyncRec。 開始 FSyncRecList.Lockを。 してみてください (p)を新たにします。 FSyncRecList.Add(P)。 p.Method:= AProc。 p.Queue:=はtrue。 ExecProcInThread(チェック)。 最後に FSyncRecList.Unlock; 終わり; 終わり; 手順TJooThread.Synchronize(AProc:TThreadMethod)。 VARの P:PSyncRec。 O:にTEvent。 開始 FSyncRecList.Lockを。 してみてください (p)を新たにします。 p.Method:= AProc。 O:= TEvent.Create(nilを、trueに、falseに、 ''); p.Signle:= O; p.Queue:= Falseに; //スレッドトリガー開始; ExecProcInThread(チェック) ついに FSyncRecListを.Unlock; END; o.WaitFor; //ウエイト信号AProc完了実行 o.Free; END; {} TSyncRecList 手順TSyncRecList.FreeItem(アイテム:PSyncRec); 開始 継承; IF割り当て(Item.Signle)次に Item.Signle .free; 廃棄(項目); END; 終了。