导航
  • 主页
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

送100分:线程处理问题

fromv 2002-10-21 12:10:50
我在主程序中设置了一个数据缓冲区,想编一个线程来处理它。哪位能提供思路和原码?货到送分!
...全文
9 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
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;
}

回复
fromv 2002-10-21
主窗体上有两个Memo,将Memo1输入的值转换为数据包,写入缓冲区。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char Buf[1024];
char *str = new char[128];
memset(str,0,128);
StrCat(str,"%");//数据包开始标记
StrCat(str,Memo1->Lines->Text.c_str());
StrCat(str,"%");");//数据包结束标记
for(int i = 0;i<100;i++)
{
StrCat(Buf,Str);
}
}
想用线程来处理缓冲区:先识别数据包标记,然后将数据显示在Memo2中,删除这个数据包,接着处理下一条数据包。



回复
fromv 2002-10-21
主窗体上有两个Memo,将Memo1输入的值转换为数据包,写入缓冲区。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char Buf[1024];
char *str = new char[128];
memset(str,0,128);
StrCat(str,"%");//数据包开始标记
StrCat(str,Memo1->Lines->Text.c_str());
StrCat(str,"%");");//数据包结束标记
for(int i = 0;i<100;i++)
{
StrCat(Buf,Str);
}
}
想用线程来处理缓冲区:先识别数据包标记,然后将数据显示在Memo2中,删除这个数据包,接着处理下一条数据包。



回复
fromv 2002-10-21
主窗体上有两个Memo,将Memo1输入的值转换为数据包,写入缓冲区。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char Buf[1024];
char *str = new char[128];
memset(str,0,128);
StrCat(str,"%");//数据包开始标记
StrCat(str,Memo1->Lines->Text.c_str());
StrCat(str,"%");");//数据包结束标记
for(int i = 0;i<100;i++)
{
StrCat(Buf,Str);
}
}
想用线程来处理缓冲区:先识别数据包标记,然后将数据显示在Memo2中,删除这个数据包,接着处理下一条数据包。



回复
大大怪老张 2002-10-21
你可以用线程来设置并管理这个数据缓冲区...


你要怎么处理?
回复
发动态
发帖子
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
社区公告
暂无公告