fthread.cpp

来自「最新版 JCL+JVCL控件!非常不错的控件资源。包含了所能用到的大部分功能!」· C++ 代码 · 共 674 行 · 第 1/2 页

CPP
674
字号
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnSuspendAll2Click(TObject *Sender)
{
 cbAutoStart2->Checked=false;
 JvThread2->Suspend(); // all threads
 Memo->Lines->Add("Job2 suspended");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnResumeAll1Click(TObject *Sender)
{
 JvThread1->Resume(); // all threads
 Memo->Lines->Add("Job1 resumed");
 cbAutoStart1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnResumeAll2Click(TObject *Sender)
{
 JvThread2->Resume(); // all threads
 Memo->Lines->Add("Job2 resumed");
 cbAutoStart2->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnTerminate1Click(TObject *Sender)
{
 cbAutoStart1->Checked=false;
 JvThread1->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnTerminate2Click(TObject *Sender)
{
 cbAutoStart2->Checked=false;
 JvThread2->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  Memo->Lines->Add("Application shutdown");

  cbAutoStart1->Checked=false;
  cbAutoStart2->Checked=false;

  JvThread1->Terminate();
  JvThread2->Terminate();

  Memo->Lines->Add("Job1: waiting for completion ...");
  JvThread1->WaitFor();
  Memo->Lines->Add("Done");

  Memo->Lines->Add("Job2: waiting for completion ...");
  JvThread2->WaitFor();
  Memo->Lines->Add("Done");

  if(JvThread1->Count)
  {
   Memo->Lines->Add("Job1: removing zombies ...");
   JvThread1->RemoveZombie();
   Memo->Lines->Add("Done");
  }

  if(JvThread2->Count)
  {
   Memo->Lines->Add("Job2: removing zombies ...");
   JvThread2->RemoveZombie();
   Memo->Lines->Add("Done");
  }

  Memo->Lines->Add("Finished");
  ::Sleep(2000);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::JvThreadBegin(TObject *Sender)
{
 if(rbExOnBegin->Checked)
 {
  cbAutoStart1->Checked=false;
  cbAutoStart2->Checked=false;
  throw Exception("OnBegin");
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::JvThreadBeforeResume(TObject *Sender)
{
 if(rbExOnBeforeResume->Checked)
  throw Exception("OnBeforeResume");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::JvThread1Finish(TObject *Sender)
{
 TJvBaseThread* t=dynamic_cast<TJvBaseThread*>(Sender);
 if(t)
 {
  int id=t->ThreadID;
  int rv=t->ReturnValue;
  TJvThread* Container=dynamic_cast<TJvThread*>(t->Container);

  Memo->Lines->Add("Job1 finished: "+IntToHex(id, 8)+" result: "+IntToStr(rv));

  if(rbExOnFinish->Checked)
  {
   cbAutoStart2->Checked=false; // for preventing endless exception generation
   throw Exception("OnFinish");
  }
 }
 else // for testing only
  Memo->Lines->Add("Job1 finished: unknown object 'Sender'");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::JvThread2Finish(TObject *Sender)
{
 TJvBaseThread* t=dynamic_cast<TJvBaseThread*>(Sender);
 if(t)
 {
  int id=t->ThreadID;
  int rv=t->ReturnValue;
  TJvThread* Container=dynamic_cast<TJvThread*>(t->Container);

  Memo->Lines->Add("Job2 finished: "+IntToHex(id, 8)+" result: "+IntToStr(rv));
  SJobData* data=(SJobData*)t->Params;
  delete data;

  if(rbExOnFinish->Checked)
  {
   cbAutoStart2->Checked=false; // for preventing endless exception generation
   throw Exception("OnFinish");
  }
 }
 else // for testing only
  Memo->Lines->Add("Job2 finished: unknown object 'Sender'");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::JvThread1FinishAll(TObject *Sender)
{
 TJvThread* Container=dynamic_cast<TJvThread*>(Sender);
 Memo->Lines->Add("Job1 finished all");
 if(rbExOnFinishAll->Checked)
 {
  cbAutoStart1->Checked=false; // for preventing endless exception generation
  throw Exception("OnFinishAll");
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::JvThread2FinishAll(TObject *Sender)
{
 TJvThread* Container=dynamic_cast<TJvThread*>(Sender);
 Memo->Lines->Add("Job2 finished all");
 if(rbExOnFinishAll->Checked)
 {
  cbAutoStart2->Checked=false; // for preventing endless exception generation
  throw Exception("OnFinishAll");
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MemoDblClick(TObject *Sender)
{
 Memo->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::tmrStatusTimer(TObject *Sender)
{
 lbCount1->Caption="Job1 count: "+IntToStr(JvThread1->Count);
 lbCount2->Caption="Job2 count: "+IntToStr(JvThread2->Count);

 if(JvThread1->Count==0) lbStats1->Caption = "ID:-------- V:-";
 if(JvThread2->Count==0) lbStats2->Caption = "ID:-------- V:-";

 cbJobTerminated1->Checked=JvThread1->Terminated;
 cbJobTerminated2->Checked=JvThread2->Terminated;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::tmrAutoTimer(TObject *Sender)
{
 if(cbAutoStart1->Checked)
 {
  if(rand()&1) btnStartJob1->Click();
  else btnStartJob1SimpleDlg->Click();
 }

 if(cbAutoStart2->Checked)
 {
  if(rand()&1) btnStartJob2->Click();
  else btnStartJob2AnimatedDlg->Click();
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnSuspendItselfClick(TObject *Sender)
{
 SuspendRandomThread=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnRaiseExceptionClick(TObject *Sender)
{
 RaiseExceptInThread=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnRemoveZombieClick(TObject *Sender)
{
 JvThread1->RemoveZombie();
 JvThread2->RemoveZombie();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnShowStateClick(TObject *Sender)
{ // example of use JvThread->Threads[]
 AnsiString s;
 char c;

 JvThread1->Lock();
 try
 {
  if(JvThread1->Count)
  {
   Memo->Lines->Add("Job1 list");
   Memo->Lines->Add("ID       Active Finished Return Value");
   for(int i=0; i<JvThread1->Count; ++i)
   {
    TJvBaseThread* T=JvThread1->Threads[i];
    s=IntToHex((int)T->ThreadID, 8)+" ";
    if(T->ExecuteIsActive) c='+'; else c='-'; s+=c; s+="      ";
    if(T->Finished) c='+'; else c='-'; s+=c; s+="        ";
    s+=IntToStr(T->ReturnValue);
    Memo->Lines->Add(s);
   }
  }
  else
   Memo->Lines->Add("Job1 list is empty");
 }
 __finally
 {
  JvThread1->Unlock();
 }

 JvThread2->Lock();
 try
 {
  if(JvThread2->Count)
  {
   Memo->Lines->Add("Job2 list");
   Memo->Lines->Add("ID       Active Finished Return Value");
   for(int i=0; i<JvThread2->Count; ++i)
   {
    TJvBaseThread* T=JvThread2->Threads[i];
    s=IntToHex((int)T->ThreadID, 8)+" ";
    if(T->ExecuteIsActive) c='+'; else c='-'; s+=c; s+="      ";
    if(T->Finished) c='+'; else c='-'; s+=c; s+="        ";
    s+=IntToStr(T->ReturnValue);
    Memo->Lines->Add(s);
   }
  }
  else
   Memo->Lines->Add("Job2 list is empty");
 }
 __finally
 {
  JvThread2->Unlock();
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnExecuteAndWaitClick(TObject *Sender)
{
 if(rand()&1) JvThread1->ThreadDialog = JvThreadSimpleDialog1;
 else JvThread1->ThreadDialog = NULL;

 Memo->Lines->Add("Execute and wait ...");
 // JvThread1->ExecuteAndWait(NULL);
 JvThread1->ExecuteThreadAndWait(NULL);
 Memo->Lines->Add("Execute and wait: Done");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DynamicExecute(TObject *Sender, Pointer Params)
{
  TJvBaseThread* ThisThread=dynamic_cast<TJvBaseThread*>(Sender);
  if(ThisThread==NULL) // for testing only
   throw Exception("Execution error: 'Sender' is not TJvBaseThread object");

  if(ThisThread->Terminated)
  { // terminated before resume
   ThisThread->ReturnValue=-1;
   exit;
  }

  int i, j, k;
  bool FL_Break=false;

  ThisThread->ReturnValue=0;

  k = 0;
  for(i=0; i<1000 && !FL_Break; ++i)
  {
    for(j=0; j<10; ++j)
    {
      ++k;
      ::Sleep(0);
      Form1->ThreadID1 = ThisThread->ThreadID;
      Form1->Value1 = k;
      ThisThread->Synchronize(Form1->Stats1);
      if(SuspendRandomThread)
      {
       SuspendRandomThread=false;
       ThisThread->Suspend();
      }
      if(RaiseExceptInThread)
      {
       RaiseExceptInThread=false;
       ThisThread->ReturnValue=666;
       throw Exception("Exception in Job3, ThreadID="+IntToHex((int)ThisThread->ThreadID, 8));
      }
      if(ThisThread->Terminated)
      {
        FL_Break = true;
        JvThread1->ReturnValue=1;
        break;
      }
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnDynamicCreationClick(TObject *Sender)
{
 TJvThread* Container=new TJvThread(NULL);
 try
 {
  Container->OnBegin=(&JvThreadBegin);
  Container->BeforeResume=(&JvThreadBeforeResume);
  Container->OnExecute=(&DynamicExecute);
  Container->ThreadDialog = JvThreadSimpleDialog3;
  Memo->Lines->Add("Execute and wait Job3 ...");
  Container->ExecuteAndWait(NULL);
  Memo->Lines->Add("Execute and wait Job3: Done");
 }
 __finally
 {
  delete Container;
 }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?