0

マルチスレッドにはほとんど問題がありません。CreateThread を使用して独自のスレッドを作成し、プログラムの開始時に作成します (申し訳ありませんが、現時点では VCL スレッドを使用できません)。だから私のスレッドは私のVCLフォームで働いています。すべてのプログラム寿命 2 番目のスレッド寿命も。しかし、ここで1つの問題。VCL フォームがスレッドを終了するときに、いくつかのフォーム (クラス) パラメータをチェックできます。メイン フォームが既に終了していて、一部のスレッドがこのフォームのメソッドをチェックしようとすると、確かにアクセス違反が発生しました。

VCL フォームでチェック パラメータを保護するにはどうすればよいですか? ありがとう!

これが私のコードです。

unsigned int WINAPI CheckMutex( LPVOID lpParam )
{
    const int def = 20;
    int Cnt = def;
    UnicodeString text;
    while (1)
    {
        if (!UpdFrm || !UpdFrm->Label8 || UpdFrm->MutexTerminate)
            break;

最初にUpdFrmへのポインターをチェックしていますが、VCLフォームは終了できますが、フォームへのポインターはまだ生きています。そのため、いくつかのコントロールが存在するかどうかを確認します。その後、 MutexTerminate をチェックします

4

1 に答える 1

0

But here one problem. When VCL form going to terminate my thread can check some form (class) params

Don't do this, for exactly the reason you have found. Do not access directly any form instance vars from your secondary worker threads.

If you have to communicate with GUI-thread VCL components, or TForm descendant instance vars, do so only via Windows messages, preferably PostMessaged to the form.

The only other way round this issue is to ensure that the secondary thread is terminated before the form instance is freed. This will lead you into a maze of twisty little deadlocks, all alike :(

于 2013-05-02T18:12:20.703 に答える