多线程应用
首先,我祝大家新年快乐!身体健康!
是这样的,在做一些消耗较大的程序时,比如说大量数据导入阿什么的,总是很占用系统资源,运行一下大约都是90%左右,而且在运行时,打开别的窗口,数据导入的窗口就很难打开、界面上的静态控件也显示不出来。所以我想用多线程实现,比如一个用来显示界面;一个用来响应用户突然的中断,另一个才是执行导入的。可是由于我对于多线程并不熟悉,还请大家赐教!
在这里先谢谢大家了!
问题点数:100、回复次数:3Top
1 楼flmn(川流不息)回复于 2003-02-04 15:26:21 得分 25
好多东西
找个教程好好看看Top
2 楼wgh166(涌金水牛)回复于 2003-02-05 08:39:18 得分 50
一段清理数据的代码
*.h
//---------------------------------------------------------------------------
#ifndef TranHistoryH
#define TranHistoryH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <mmsystem.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Buttons.hpp>
#include <ExtCtrls.hpp>
#include <Db.hpp>
#include <DBTables.hpp>
#include <ADODB.hpp>
#include <DB.hpp>
//---------------------------------------------------------------------------
class TCleanForm : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox2;
TLabel *Label1;
TLabel *Label2;
TDateTimePicker *DateTimePicker1;
TButton *Button1;
TButton *Button3;
TProgressBar *ProgressBar1;
TTimer *Timer1;
TADOStoredProc *ADOStoredProc1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall FormShow(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TCleanForm(TComponent* Owner);
int __fastcall DeleteData(char *sDate);
int num;
void __fastcall DisplayResult(TObject *);
};
//---------------------------------------------------------------------------
extern PACKAGE TCleanForm *CleanForm;
//---------------------------------------------------------------------------
*.cpp
//---------------------------------------------------------------------------
#include <dos.h>
#include <stdio.h>
#include <vcl.h>
#pragma hdrstop
#include "CleanDataThread.h"
#include "TranHistory.h"
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TCleanForm *CleanForm;
//---------------------------------------------------------------------------
__fastcall TCleanForm::TCleanForm(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TCleanForm::Button1Click(TObject *Sender)
{
AnsiString sBdate, sCdate;
int ymd[2][3], i, num;
char tmp[16], sDate[16], msg[32];
TCleanDataThread * CleanDataThread;
memset(tmp, 0, 16);
sBdate=DateTimePicker1->DateTime.FormatString("yyyy-mm-dd");
sCdate ="20" + DateTimePicker1->Date.CurrentDate();
strncpy(tmp, sBdate.c_str(), 10);
ymd[0][0]=atoi(tmp);
for(i=4;i<10;i++){
if(tmp[i]=='-' && i<6) ymd[0][1]=atoi(tmp+i+1);
if(tmp[i]=='-' && i>5) ymd[0][2]=atoi(tmp+i+1);
}
memset(tmp, 0, 16);
strncpy(tmp, sCdate.c_str(), 10);
ymd[1][0]=atoi(tmp);
for(i=4;i<10;i++){
if(tmp[i]=='-' && i<6) ymd[1][1]=atoi(tmp+i+1);
if(tmp[i]=='-' && i>5) ymd[1][2]=atoi(tmp+i+1);
}
if(ymd[0][0]*10000 + ymd[0][1]*100 + ymd[0][2]>ymd[1][0]*10000 + ymd[1][1]*100 + ymd[1][2]){
ShowMessage("处理日期不能大于今日!!");
return;
}
sprintf(sDate,"%d-%d-%d",ymd[0][0],ymd[0][1],ymd[0][2]);
//ShowMessage(CleanForm->DateTimePicker1->Date.FormatString("yyyy-mm-dd"));
ProgressBar1->Enabled=true;
sndPlaySound("../sound/Notify.wav", SND_SYNC);
if(Application->MessageBox("请确认是否要清理数据!!", "确认", MB_OKCANCEL) != IDOK) return;
Timer1->Enabled=true;
ProgressBar1->Position=0;
CleanForm->Button1->Enabled=false;
CleanDataThread = new TCleanDataThread(sDate);
CleanDataThread->Priority = tpIdle;//优先级低
CleanDataThread->OnTerminate=DisplayResult;//线程停止
}
void __fastcall TCleanForm::DisplayResult(TObject *)
{
char msg[60];
Button1->Enabled=true;
Timer1->Enabled=false;
ProgressBar1->Position=ProgressBar1->Max;
sprintf(msg,"共清除 %d 条数据\0", num);
ShowMessage(msg);
}
//---------------------------------------------------------------------------
void __fastcall TCleanForm::Button3Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TCleanForm::FormShow(TObject *Sender)
{
struct date d;
char tmp[32];
getdate(&d);
sprintf(tmp, "%d-%d-%d\0", d.da_year-1,d.da_mon, d.da_day);
DateTimePicker1->Date=AnsiString(tmp);
Button1->Enabled=true;
ProgressBar1->Position=0;
ProgressBar1->Enabled=false;
Button1->Enabled=MainForm->IsAdmin;
}
//---------------------------------------------------------------------------
void __fastcall TCleanForm::Timer1Timer(TObject *Sender)
{
ProgressBar1->Position +=5;
if(ProgressBar1->Position==ProgressBar1->Max)
ProgressBar1->Position=0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef CleanDataThreadH
#define CleanDataThreadH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TCleanDataThread : public TThread
{
private:
// void __fastcall CleanData();
protected:
void __fastcall Execute();
void __fastcall CleanData();
public:
__fastcall TCleanDataThread(AnsiString sdate);
};
//---------------------------------------------------------------------------
#endif
*.cpp
//---------------------------------------------------------------------------
__fastcall TCleanDataThread::TCleanDataThread(AnsiString sdate)
: TThread(false)
{
}
void __fastcall TCleanDataThread::CleanData()
{
try{
CleanForm->ADOStoredProc1->Parameters->Items[1]->Value=CleanForm->DateTimePicker1->Date.FormatString("yyyy-mm-dd");
CleanForm->ADOStoredProc1->ExecProc();
CleanForm->num=CleanForm->ADOStoredProc1->Parameters->Items[0]->Value;
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
//---------------------------------------------------------------------------
void __fastcall TCleanDataThread::Execute()
{
CleanData();
//---- Place thread code here ----
}
/
Top
3 楼shclhs(hello)回复于 2003-02-05 13:14:34 得分 25
找本书看看。Top




