6

私は c++ ビルダーが初めてで、スレッドに慣れていません。誰かが例を投稿したり、正しい方向に向けてくれることを望んでいました。

formShow()関数を C++ ビルダーにロードするフォームがあります。プログラムに実行させたいことは実行しますが、その後で初めて実際のフォームが表示されます。

このために、フォームとプログラムのバックグラウンド実行をスレッド化する必要があります。誰でも私を助けてくれますか?

4

1 に答える 1

8

OnShowスレッドをまったく使用せずに、イベントが終了するまでロジックを遅らせる方が簡単な場合があります。例えば:

const UINT WM_DO_WORK = WM_USER + 1;

void __fastcall TForm1::FormShow(TObject *Sender)
{
    PostMessage(Handle, WM_DO_WORK, 0, 0);
}

void __fastcall TForm1::WndProc(TMessage &Message)
{
    if (Message.Msg == WM_DO_WORK)
    {
        // do work here ...
    }
    else
        TForm::WndProc(Message);
}

本当にコードをスレッド化したい場合は、次のように実行できます。

class TMyThread : public TThread
{
protected:
    virtual void __fastcall Execute();
public:
    __fastcall TMyThread();
};

__fastcall TMyThread::TMyThread()
    : TThread(true)
{
    FreeOnTerminate = true;
    // setup other thread parameters as needed...
}

void __fastcall TMyThread::Execute()
{
    // do work here ...
    // if you need to access the UI controls,
    // use the TThread::Synchornize() method for that
}

void __fastcall TForm1::FormShow(TObject *Sender)
{
    TMyThread *thrd = new TMyThread();
    thrd->OnTerminate = &ThreadTerminated;
    thrd->Resume();
}

void __fastcall TForm1::ThreadTerminated(TObject *Sender)
{
    // thread is finished with its work ...
}
于 2012-07-24T23:09:30.990 に答える