多线程应用

olivertree 2003-02-04 01:43:45
首先,我祝大家新年快乐!身体健康!
是这样的,在做一些消耗较大的程序时,比如说大量数据导入阿什么的,总是很占用系统资源,运行一下大约都是90%左右,而且在运行时,打开别的窗口,数据导入的窗口就很难打开、界面上的静态控件也显示不出来。所以我想用多线程实现,比如一个用来显示界面;一个用来响应用户突然的中断,另一个才是执行导入的。可是由于我对于多线程并不熟悉,还请大家赐教!
在这里先谢谢大家了!
...全文
17 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
牧牛人软件 2003-02-05
  • 打赏
  • 举报
回复
一段清理数据的代码

*.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 ----
}
/
shclhs 2003-02-05
  • 打赏
  • 举报
回复
找本书看看。
flmn 2003-02-04
  • 打赏
  • 举报
回复
好多东西

找个教程好好看看

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧