CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  网络及通讯开发

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

楼主dongdongmaomao()2006-08-30 21:47:03 在 C++ Builder / 网络及通讯开发 提问

各位大侠,这是小弟写的一段小程序,是以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多线程问题"中大家可以找到.  
   
   
   
   
   
   
   
   
  问题点数:20、回复次数:5Top

1 楼dongdongmaomao()回复于 2006-08-30 21:48:07 得分 0

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;  
  //---------------------------------------------------------------------------  
  #endifTop

2 楼dongdongmaomao()回复于 2006-08-30 21:48:31 得分 0

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();  
  }  
  //---------------------------------------------------------------------------Top

3 楼dongdongmaomao()回复于 2006-08-30 21:48:50 得分 0

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;  
  //---------------------------------------------------------------------------  
  #endifTop

4 楼wanglovec(阳光飞舞)回复于 2006-08-31 13:43:24 得分 0

SF   呵呵Top

5 楼netliuming(你有安全感吗?)回复于 2006-09-21 10:46:44 得分 0

太多了,没细看,感觉有点乱,只说一点,线程内你好象每次只做一次操作,线程就退出了。  
  while(!Terminated)  
  {  
        Terminate();  
  }  
  上面得循环无任何意思(你在操作   Terminate()前没有任何条件判断).  
  你先把自己思路理清了  
   
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:dongdongmaomao

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo