谁有c++的多线程编程资料,源代码??

sensing 2002-10-30 11:35:03
...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuilin2002 2002-12-25
  • 打赏
  • 举报
回复
给你个api的例子
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "winsock2.h"
#include "s.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define WSVERS MAKEWORD(2, 0)
DWORD WINAPI TCP_Echo(LPVOID lpPara);
DWORD WINAPI MainThread(LPVOID lpPara);
TForm1 *Form1;
struct sockaddr_in fsin,sin;
SOCKET msock, ssock;
unsigned short port =3223;
int alen;
HANDLE Socket_Single[3];
int CreateListen();
//---------------------------------------------------------------------------
DWORD WINAPI TCP_Echo(LPVOID lpPara)
{
char buf[858];
char buff1[9];
char buff2[850+1];
SOCKET socket;
socket=(SOCKET )lpPara;
recv(socket, buf, sizeof(buf), 0);
send(socket,buf,sizeof(buf),0);
Form1->Memo1->Lines->Add(buf);
memset(buff1,0,sizeof(buff1));
memset(buff2,0,sizeof(buff2));
memcpy(buff1,buf,8);
memcpy(buff2,buf+8,850);
long pri=0;
DWORD dw=WaitForMultipleObjects(3,Socket_Single ,false ,60000);
switch (dw)
{
case WAIT_OBJECT_0+0 :

Form1->Query1->SQL->Clear();
Form1->Query1->SQL->Add("INSERT INTO T_toSwitch (capcode,contents)");
Form1->Query1->SQL->Add("VALUES(:buff1,:buff2)");
Form1->Query1->Params->Items[0]->AsString=buff1;
Form1->Query1->Params->Items[1]->AsString=buff2;
Form1->Query1->ExecSQL();

ReleaseSemaphore(Socket_Single[0] ,1,&pri);

break;
case WAIT_OBJECT_0+1 :


Form1->Query2->SQL->Clear();
Form1->Query2->SQL->Add("INSERT INTO T_toSwitch (capcode,contents)");
Form1->Query2->SQL->Add("VALUES(:buff1,:buff2)");
Form1->Query2->Params->Items[0]->AsString=buff1;
Form1->Query2->Params->Items[1]->AsString=buff2;
Form1->Query2->ExecSQL();

ReleaseSemaphore(Socket_Single[1] ,1,&pri);

break;
case WAIT_OBJECT_0+2 :

Form1->Query3->SQL->Clear();
Form1->Query3->SQL->Add("INSERT INTO T_toSwitch (capcode,contents)");
Form1->Query3->SQL->Add("VALUES(:buff1,:buff2)");
Form1->Query3->Params->Items[0]->AsString=buff1;
Form1->Query3->Params->Items[1]->AsString=buff2;
Form1->Query3->ExecSQL();

ReleaseSemaphore(Socket_Single[2] ,1,&pri);

break;
case WAIT_TIMEOUT :

break;
default:
break;

}
closesocket(socket);
return 0;
}

DWORD WINAPI MainThread(LPVOID lpPara)
{
CreateListen();
return 0;
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Socket_Single[0] = CreateSemaphore(NULL,1,1,NULL);
Socket_Single[1] = CreateSemaphore(NULL,1,1,NULL);
Socket_Single[2] = CreateSemaphore(NULL,1,1,NULL);
}
//---------------------------------------------------------------------------

int CreateListen()
{
WSADATA wsadata;
if (WSAStartup(WSVERS,&wsadata) != 0)
{
MessageBox(NULL,"wsock32.dll can not be initialized","warning",MB_OK);
exit(EXIT_FAILURE);
}
Form1->Memo1->Lines->Add("服务器已经启动");
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr =INADDR_ANY;
sin.sin_port = htons(port);
msock = socket(AF_INET, SOCK_STREAM, 0);
if (msock == INVALID_SOCKET)
{
MessageBox(NULL,"create socket error!","warning",MB_OK);
exit(EXIT_FAILURE);
}
if (bind(msock, (struct sockaddr *)&sin, sizeof(sin))==SOCKET_ERROR)
{
MessageBox(NULL,"bind error!","warning",MB_OK);
exit(EXIT_FAILURE);
}
if (listen(msock, 200)==SOCKET_ERROR)
{
MessageBox(NULL,"listen error!","warning",MB_OK);
exit(EXIT_FAILURE);
}
while(1)
{
alen = sizeof(struct sockaddr);
ssock = accept(msock, (struct sockaddr *)&fsin, &alen);
Form1->Memo1->Lines->Add("connect");
if (ssock == INVALID_SOCKET)
{
MessageBox(NULL,"accept error!","warning",MB_OK);
exit(EXIT_FAILURE);
}
DWORD dwThreadId;
if(CreateThread(NULL,0,TCP_Echo,(LPVOID)ssock,0,&dwThreadId)<0)
{
MessageBox(NULL,"Create thread error!","warning",MB_OK);
exit(EXIT_FAILURE);
}

}


}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD ID;
CreateThread(NULL,0,MainThread,NULL,0,&ID);
return ;
}
//---------------------------------------------------------------------------

SuperSuperLéon 2002-12-25
  • 打赏
  • 举报
回复


好好棒哟,你工作的地方不错嘛。
gudufeixiang 2002-12-24
  • 打赏
  • 举报
回复
m
牧牛人软件 2002-11-15
  • 打赏
  • 举报
回复
up
flowercity 2002-11-15
  • 打赏
  • 举报
回复
//******************线程单元文件××××××××××××××××××××××××××××
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "main.h" //包含主窗体
#pragma package(smart_init)
extern HANDLE hComm; //主窗体创建的HANDLE
//---------------------------------------------------------------------------

// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall Unit1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------

__fastcall TRead232::TRead232(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TRead232::Execute()
{
//---- Place thread code here ----
while(!Terminated) //只要线程不中止,就执行ReadData()函数
Synchronize(ReadData);
}
//---------------------------------------------------------------------------
void __fastcall TRead232::ReadData()
{
String Temp;
char inbuff[1024]; // 缓存区大小
DWORD nBytesRead,dwEvent,dwError;
COMSTAT cs;
if(hComm==INVALID_HANDLE_VALUE) //端口是否打开
return;
ClearCommError(hComm,&dwError,&cs); //端口状态
if(cs.cbInQue>sizeof(inbuff))
{
PurgeComm(hComm,PURGE_RXCLEAR);
return;
}
ReadFile(hComm,inbuff,cs.cbInQue,&nBytesRead,NULL); // 读取数据
inbuff[cs.cbInQue]='\0';
mainForm->Memo2->Text=mainForm->Memo2->Text+inbuff;
}
//---------------------------------------------------------------------------
//***************************线程头文件×××××××××××××××××××××××××××××××××××
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TRead232 : public TThread
{
private:
void __fastcall TRead232::ReadData(); //定义一个读取数据的函数
protected:
void __fastcall Execute();
public:
__fastcall TRead232(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
//***********************************主窗体调用线程××××××××××××××××××××××××××××××××
//---------------------------------------------------------------------------
//××××××××××××××××××××××××××××××××××××头文件
#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>

//---------------------------------------------------------------------------
class TmainForm : public TForm
{
__published: // IDE-managed Components
TRadioGroup *RadioGroup1;
TButton *Button1;
TButton *Button2;
TLabel *Label1;
TLabel *Label2;
TMemo *Memo1;
TMemo *Memo2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Memo1KeyPress(TObject *Sender, char &Key);
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);

private: // User declarations

TThread *Read232; //声名一个TReadThread类型的对象

public: // User declarations
__fastcall TmainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TmainForm *mainForm;
//---------------------------------------------------------------------------
#endif
//××××××××××××××××××××××××××××××××单元文件××××××××××××××××××××××××××
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h" //包含线程文件
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TmainForm *mainForm;
HANDLE hComm;
//---------------------------------------------------------------------------
__fastcall TmainForm::TmainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TmainForm::Button1Click(TObject *Sender)
{
char *ComNo;
String Temp;
DCB dcb;
Temp="COM"+IntToStr(RadioGroup1->ItemIndex+1);
ComNo=Temp.c_str();
hComm=CreateFile(ComNo,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hComm==INVALID_HANDLE_VALUE)
{
MessageBox(0,"端口打开错误!","Comm Error",MB_OK);
return;
}
//设置串口参数
GetCommState(hComm,&dcb);
dcb.BaudRate=CBR_9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(!SetCommState(hComm,&dcb))
{
MessageBox(0,"端口设置错误!","Set Error",MB_OK);
CloseHandle(hComm);
return;
}
Read232->Resume();

}
//---------------------------------------------------------------------------
void __fastcall TmainForm::Memo1KeyPress(TObject *Sender, char &Key)
{
String Temp;
char *SendData;
int ln;
unsigned long lrc,BS;
if(Key!=13) //回车结束输入
return;
if(hComm==0) //检测端口状态
return;
Temp=Memo1->Text;
SendData=Temp.c_str();
BS=Temp.Length();
WriteFile(hComm,SendData,BS,&lrc,NULL); //发送数据
}
//---------------------------------------------------------------------------
void __fastcall TmainForm::FormCreate(TObject *Sender)
{
Read232=new TRead232(true);
Read232->FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall TmainForm::Button2Click(TObject *Sender)
{
Read232->Terminate();
if(hComm!=INVALID_HANDLE_VALUE)
CloseHandle(hComm);
exit(EXIT_SUCCESS);
}
//---------------------------------------------------------------------------
希望对你有个启示!!!!
牧牛人软件 2002-11-15
  • 打赏
  • 举报
回复
/---------------------------------------------------------------------------

__fastcall TCleanDataThread::TCleanDataThread(AnsiString sdate)
: TThread(false)
{
}

void __fastcall TCleanDataThread::CleanData()
{

try{

CleanForm->Button1->Enabled=false;
CleanForm->ADOStoredProc1->Parameters->Items[1]->Value=CleanForm->DateTimePicker1->Date.FormatString("yyyy-mm-dd");
// CleanForm->ADOStoredProc1->Prepare();
CleanForm->ADOStoredProc1->ExecProc();
CleanForm->num=CleanForm->ADOStoredProc1->Parameters->Items[0]->Value;

}
catch (Exception &exception)
{
Application->ShowException(&exception);

}


CleanDataThread = new TCleanDataThread(sDate);
CleanDataThread->Priority = tpIdle;

CleanDataThread->OnTerminate=DisplayResult;//线程停止

........

//---------------------------------------------------------------------------
void __fastcall TCleanDataThread::Execute()
{
CleanData();
//---- Place thread code here ----
}
//---------------------------------
hotxu 2002-11-13
  • 打赏
  • 举报
回复
pub.chinafsdu.net user:pub password:pub
win32多线程程序设计配套光盘.rar
warton 2002-10-30
  • 打赏
  • 举报
回复
关键部分:
开始线程

if (_beginthread(TCP_Echo, STKSIZE, (void*)ssock) <0)
{
printf( "启动新线程失败!\n ");
return -1;
}



_endthread();
// return 0;
break;
warton 2002-10-30
  • 打赏
  • 举报
回复
看我的代码,socket api,多线程:


#define WSVERS MAKEWORD(2, 0)
#define STKSIZE 16536

#include <stdio.h >
#include <winsock2.h >
#include <process.h >

int TCP_Echo(SOCKET,struct sockaddr_in);

int main()
{
struct sockaddr_in fsin, sin;
SOCKET msock, ssock;
struct hostent *hostname;
unsigned short port = 10000;
int alen;
WSADATA wsadata;


if (WSAStartup(WSVERS, &wsadata) != 0)
{
printf( "调用winsock.dll失败! ");
return -1;
}

memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr =inet_addr( "192.168.4.142 "); //
sin.sin_port = htons(port);

msock = socket(PF_INET, SOCK_STREAM, 0);
if (msock == INVALID_SOCKET)
{
printf( "create socket error\n ");
return -1;
}

if (bind(msock, (struct sockaddr *)&sin, sizeof(sin))==SOCKET_ERROR)
{
printf( "bind error\n ");
return -1;
}

if (listen(msock, 5)==SOCKET_ERROR)
{
printf( "listen error\n ");
return -1;
}
//hostname=gethostbyaddr(inet_ntoa(sin.sin_addr),8,0);
//printf( "%s\n ",hostname- >h_name);
printf( "本地地址:%s\n ",inet_ntoa(sin.sin_addr));//
printf( "服务器监听端口:%d\n ",ntohs(sin.sin_port));


while(1)
{
alen = sizeof(struct sockaddr);
ssock = accept(msock, (struct sockaddr *)&fsin, &alen);
if (ssock == INVALID_SOCKET)
{
printf( "accept error\n ");
return -1;
}
printf( "有客户连接自 %s\r\n ", inet_ntoa(fsin.sin_addr));
if (_beginthread(TCP_Echo, STKSIZE, (void*)ssock) <0)
{
printf( "启动新线程失败!\n ");
return -1;
}
}
}
//线程要调用的函数:处理客户发送来的数据
int TCP_Echo(SOCKET fd,struct sockaddr_in sin)
{
char buf[4096];
int cc = 0;

memset(buf, 0, sizeof(buf));
strcpy(buf, "Enter 'Q' to exit\r\n ");
if (send(fd, buf, strlen(buf), 0)==SOCKET_ERROR)
{
printf( "echo send error\n ");
return -1;
}

memset(buf, 0, sizeof(buf));
cc = recv(fd, buf, sizeof(buf), 0);
printf( "客户发送的数据:%s\n ", buf);

while(cc!=SOCKET_ERROR && cc > 0)
{
if (send(fd, buf, cc, 0)==SOCKET_ERROR)
{
printf( "echo send error\n ");
break;
}
/* if (send(fd, "\r\n ", 2, 0)==SOCKET_ERROR)
{
printf( "echo send error\n ");
break;
}*/
memset(buf, 0, sizeof(buf));
cc = recv(fd, buf, sizeof(buf), 0);
printf( "客户发送的数据:%s\n ", buf);
if (buf[0]=='Q')
{

_endthread();
// return 0;
break;
}
}
if (cc==SOCKET_ERROR)
printf( "echo recv error\n ");

closesocket(fd);
return 0;
}

cuilin2002 2002-10-30
  • 打赏
  • 举报
回复
创建线程可以用
CreateThread(NULL,0,TCP_Echo,(LPVOID)ssock,0,&dwThreadId)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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