再续socket多线程问题(有源代码)

dongdongmaomao 2006-08-30 09:47:03
各位大侠,这是小弟写的一段小程序,是以CHAT为蓝本,在上面自己添加了一些代码,主要是想用多线程编写一段有关SOCKET传送数据的程序.SERVER中有CodeThread,DecodeThread,Trans_dataThread三个线程,数据在CodeThread线程中把数据库中的数据进行处理,然后在Trans_dataThread线程中以流方式发送数据.CLIENT主要是接收数据,并把数据显示在3个EDIT控件里.现在小弟遇到几个问题:
1.SERVER只能发送一个数据流,在发送下一个数据流时要报错.我用debug调试时,发现它在执行str->Write(&mysocket,framelength)时报错.是不是由于上一个str还没有发送完毕?但是我已经做了线程的同步,是不是在线程同步方面还做的不正确?我如何知道Trans_dataThread线程中数据已经发送出去,并且可以结束线程,释放出str,能够给下一个CodeThread线程对str进行操作?各位大侠能不能帮小弟指
点一二.最好能给出小弟一些源代码.
2.SERVER程序调试一阵后,总要报错"stack overflow".小弟想是不是由于线程没有删除,但小弟不是写了些Terminate()的函数吗?
3.SERVER发送出数据流后,如何在EDIT3控件里显示出"NAME"字段的字符串?
小弟刚刚入门,但对builder很是感兴趣,多谢各位大侠指教.
其它的一些说明在我提出的"socket多线程问题"中大家可以找到.








...全文
539 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
netliuming 2006-09-21
  • 打赏
  • 举报
回复
太多了,没细看,感觉有点乱,只说一点,线程内你好象每次只做一次操作,线程就退出了。
while(!Terminated)
{
Terminate();
}
上面得循环无任何意思(你在操作 Terminate()前没有任何条件判断).
你先把自己思路理清了

wanglovec 2006-08-31
  • 打赏
  • 举报
回复
SF 呵呵
dongdongmaomao 2006-08-30
  • 打赏
  • 举报
回复
client端:
main.h
//----------------------------------------------------------------------------
//Borland C++Builder
//Copyright (c) 1987, 1997-2002 Borland International Inc. All Rights Reserved.
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "ScktComp.hpp"
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
//---------------------------------------------------------------------------
class TChatForm : public TForm
{
__published: // IDE-managed Components
TBevel *Bevel1;
TStatusBar *StatusBar1;
TPanel *Panel1;
TSpeedButton *SpeedButton1;
TMemo *Memo1;
TMemo *Memo2;
TMainMenu *MainMenu1;
TMenuItem *File1;
TMenuItem *FileConnectItem;
TMenuItem *Disconnect1;
TMenuItem *N1;
TMenuItem *Exit1;
TClientSocket *ClientSocket;
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
void __fastcall FileConnectItemClick(TObject *Sender);
void __fastcall Exit1Click(TObject *Sender);
void __fastcall Memo1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall ClientSocketConnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ClientSocketRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall Disconnect1Click(TObject *Sender);
void __fastcall ClientSocketError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode);
private: // User declarations
public: // User declarations
String Server;
__fastcall TChatForm(TComponent* Owner);
};

//---------------------------------------------------------------------------
extern TChatForm *ChatForm;
//---------------------------------------------------------------------------
#endif
dongdongmaomao 2006-08-30
  • 打赏
  • 举报
回复
main.cpp
/----------------------------------------------------------------------------
//Borland C++Builder
//Copyright (c) 1987, 1997-2002 Borland International Inc. All Rights Reserved.
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "main.h"
//---------------------------------------------------------------------------
#pragma link "ScktComp"
#pragma resource "*.dfm"
TMemoryStream *str = new TMemoryStream;

TChatForm *ChatForm;
//---------------------------------------------------------------------------
__fastcall TChatForm::TChatForm(TComponent* Owner)
: TForm(Owner)
{
Event = new TEvent(NULL,true,false,NULL);
}
//---------------------------------------------------------------------------

void __fastcall TChatForm::FileListenItemClick(TObject *Sender)
{
FileListenItem->Checked = !FileListenItem->Checked;
if (FileListenItem->Checked)
{
ServerSocket->Active = true;
StatusBar1->Panels->Items[0]->Text = "Listening...";
}else
{
if (ServerSocket->Active)
{
ServerSocket->Active = false;
}
StatusBar1->Panels->Items[0]->Text = "";
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TDecodeThread::TDecodeThread(void) : TThread(true)
{
FreeOnTerminate=true;//线程结束后,强迫对象释放它本身
Resume();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TDecodeThread::Execute(void)
{

}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TTrans_dataThread::TTrans_dataThread(void) : TThread(true)
{
FreeOnTerminate=true;//线程结束后,强迫对象释放它本身
Resume();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TTrans_dataThread::Execute(void)
{
while(!Terminated&ChatForm->Event->WaitFor(10000000) == wrSignaled)
{
ChatForm->Event->ResetEvent();
str->Position=0;//如不把指针返回到开头,就没有发送出数据
ChatForm->ServerSocket->Socket->Connections[0]->SendStream(str);
Terminate();
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TCodeThread::TCodeThread(void) : TThread(true)
{
FreeOnTerminate=true;//线程结束后,强迫对象释放它本身
Resume();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TCodeThread::Execute(void)
{
while(!Terminated)
{
ChatForm->Event->ResetEvent();
mysocket.name=ChatForm->Table1->FieldByName("NAME")->AsString;
mysocket.size=ChatForm->Table1->FieldByName("SIZE")->AsInteger;
mysocket.weight=ChatForm->Table1->FieldByName("WEIGHT")->AsInteger;
str->Write(&mysocket,framelength);
ChatForm->Event->SetEvent();
Terminate();
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::Exit1Click(TObject *Sender)
{
ServerSocket->Close();
Close();
if(DecodeThread)
DecodeThread->Terminate();
if(CodeThread)
CodeThread->Terminate();
if(Trans_dataThread)
Trans_dataThread->Terminate();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::Memo1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key == VK_RETURN)
{
ServerSocket->Socket->Connections[0]->SendText(
Memo1->Lines->Strings[Memo1->Lines->Count - 1]);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::FormCreate(TObject *Sender)
{
FileListenItemClick(NULL);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo2->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketAccept(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteAddress;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo2->Lines->Clear();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->Panels->Items[0]->Text = "Listening...";
}
//---------------------------------------------------------------------------

void __fastcall TChatForm::Button1Click(TObject *Sender)
{
Trans_dataThread = new TTrans_dataThread;
CodeThread = new TCodeThread;
// Event = new TEvent(NULL,true,false,NULL);
}
//---------------------------------------------------------------------------

void __fastcall TChatForm::FormClose(TObject *Sender, TCloseAction &Action)
{
ServerSocket->Close();
if(DecodeThread)
DecodeThread->Terminate();
if(CodeThread)
CodeThread->Terminate();
if(Trans_dataThread)
Trans_dataThread->Terminate();
Close();
}
//---------------------------------------------------------------------------
dongdongmaomao 2006-08-30
  • 打赏
  • 举报
回复
SERVER端:
main.h
//----------------------------------------------------------------------------
//Borland C++Builder
//Copyright (c) 1987, 1997-2002 Borland International Inc. All Rights Reserved.
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef mainH
#define mainH

#define framelength 20//一帧数据的长度

//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "ScktComp.hpp"
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <DB.hpp>
#include <DBGrids.hpp>
#include <DBTables.hpp>
#include <Grids.hpp>
#include <syncobjs.hpp>

//---------------------------------------------------------------------------
class TCodeThread : public TThread
{
public:
__fastcall TCodeThread(void);
private:
void __fastcall Execute(void);
};
//---------------------------------------------------------------------------
class TTrans_dataThread : public TThread
{
public:
__fastcall TTrans_dataThread(void);
private:
void __fastcall Execute(void);
};
//---------------------------------------------------------------------------
class TDecodeThread : public TThread
{
public:
__fastcall TDecodeThread(void);
private:
void __fastcall Execute(void);
};
//---------------------------------------------------------------------------
struct SOCKDATA{
String name;
int size;
int weight;
}mysocket;
//---------------------------------------------------------------------------
class TChatForm : public TForm
{
__published: // IDE-managed Components
TBevel *Bevel1;
TStatusBar *StatusBar1;
TPanel *Panel1;
TMemo *Memo1;
TMemo *Memo2;
TMainMenu *MainMenu1;
TMenuItem *File1;
TMenuItem *FileListenItem;
TMenuItem *N1;
TMenuItem *Exit1;
TServerSocket *ServerSocket;
TTable *Table1;
TDataSource *DataSource1;
TDBGrid *DBGrid1;
TButton *Button1;
void __fastcall FileListenItemClick(TObject *Sender);
void __fastcall Exit1Click(TObject *Sender);
void __fastcall Memo1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall FormCreate(TObject *Sender);
void __fastcall ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocketAccept(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocketClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
TCodeThread *CodeThread;
TDecodeThread *DecodeThread;
TTrans_dataThread *Trans_dataThread;
public: // User declarations
TEvent *Event;
String Server;
__fastcall TChatForm(TComponent* Owner);
};

//---------------------------------------------------------------------------
extern TChatForm *ChatForm;
//---------------------------------------------------------------------------
#endif

1,317

社区成员

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

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