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 + -
显示快捷键?