全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1327
推到 Plurk!
推到 Facebook!

Thread中用ServerSocket的問題

尚未結案
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-26 12:34:09 IP:61.70.xxx.xxx 未訂閱
各位大大好 小弟寫了一個用Thread的聊天室 有兩個問題    Q1:其他的功能都正常可是在Thread內的指令(Form1->ServerSocket4->Socket->Connections[j]->SendText(msg);)卻不能執行 Q2:還有為什麼我寫的Thread只能執行一次之後都沒反應 以下是我的程式(綠色部分為Thread程式內容) #######################(Unit1.h)############################### //-------------------------------------------------------------------- #include #include "jpeg.hpp" #pragma hdrstop #include "Unit1.h" #include "Unit2.h" #include "Unit3.h" //-------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TThread *Char1; TThread *Char2; AnsiString CharNo,Username; AnsiString User1[8]={""}; AnsiString User2[8]={""}; int i=0,i1=0; //-------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Char1=new Char1Thread(true); Char2=new Char2Thread(true); } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { TStrings* Login; AnsiString test,id,pw,type; Login = new TStringList(); Login->Text = Socket->ReceiveText(); id = Login->Values["ID"]; pw = Login->Values["PW"]; type = Login->Values["TYPE"]; delete Login; if(type==0) { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id); ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw); ADOQuery1->SQL->Add("Select * From 資料表1 Where ID=:checkID and Password=:checkPassword"); ADOQuery1->Open(); if(ADOQuery1->RecordCount==1) { test="登入成功"; Label1->Caption=test; ServerSocket1->Socket->Connections[i-1]->SendText(test); } else { test="登入失敗"; Label1->Caption=test; ServerSocket1->Socket->Connections[i-1]->SendText(test); } } else if(type == 1) { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id); ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw); ADOQuery1->SQL->Add("Select * From 資料表1 Where ID=:checkID"); ADOQuery1->Open(); if(ADOQuery1->RecordCount==1) { test="此帳號有人使用"; Label1->Caption=test; ServerSocket1->Socket->Connections[i-1]->SendText(test); } else { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id); ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw); ADOQuery1->SQL->Add("Insert Into 資料表1 Values(:checkID,:checkPassword)"); ADOQuery1->ExecSQL(); test="此帳號註冊成功"; Label1->Caption=test; ServerSocket1->Socket->Connections[i-1]->SendText(test); } } else { test="無登入和註冊(遊客)"; Label1->Caption=test; ServerSocket1->Socket->Connections[i-1]->SendText(test); } } //-------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ServerSocket1->Active=true; ServerSocket2->Active=true; ServerSocket3->Active=true; ServerSocket4->Active=true; ServerSocket5->Active=true; Button1->Enabled=false; Button2->Enabled=true; } //-------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { ServerSocket1->Active=false; ServerSocket2->Active=false; ServerSocket3->Active=false; ServerSocket4->Active=false; ServerSocket5->Active=false; Char1->Suspend(); Char2->Suspend(); Button1->Enabled=true; Button2->Enabled=false; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket2ClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString mag,port1; TStrings* SetChar; SetChar = new TStringList(); SetChar->Text = Socket->ReceiveText(); Username=SetChar->Values["Name"]; CharNo=SetChar->Values["CharNo"]; delete SetChar; TMemoryStream *msFile=new TMemoryStream; MYPACK mp; int j,k; if(CharNo==1) { port1=8003; //mag="Port1=" port1 "\r\n"; msFile->LoadFromFile("Char1.jpg"); for(k=0;k<8;k ) { if(User1[k]=="") { User1[k]=Username; break; } } } else { port1=8004; //mag="Port1=" port1 "\r\n"; msFile->LoadFromFile("Char2.jpg"); for(k=0;k<8;k ) { if(User2[k]=="") { User2[k]=Username; break; } } } Socket->SendText(port1); int block=(msFile->Size%MAX_DATASIZE==0)? msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(j=0; jSize; mp.dwThisDataSize=((j 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-j*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=j*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket3->Socket->Connections[i1-1]->SendBuf(&mp, sizeof(MYPACK)); Sleep(10); } delete msFile; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { i=i 1; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { i=i-1; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket3ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { i1=i1 1; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket3ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { i1=i1-1; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket4ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { x=x 1; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket4ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { x=x-1; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket5ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { Label5->Caption="ok"; y=y 1; } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket5ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { y=y-1; } //--------------------------------------------------------------------void __fastcall TForm1::ServerSocket4ClientRead(TObject *Sender, TCustomWinSocket *Socket) { TStrings* Char1msg; Char1msg = new TStringList(); Char1msg->Text = Socket->ReceiveText(); Username1=Char1msg->Values["User"]; Message1=Char1msg->Values["Message"]; delete Char1msg; Char1->Resume(); } //-------------------------------------------------------------------- void __fastcall TForm1::ServerSocket5ClientRead(TObject *Sender, TCustomWinSocket *Socket) { TStrings* Char2msg; Char2msg = new TStringList(); Char2msg->Text = Socket->ReceiveText(); Username2=Char2msg->Values["User"]; Message2=Char2msg->Values["Message"]; delete Char2msg; Char2->Resume(); } //-------------------------------------------------------------------- #####################(Unit2.h)###################### //-------------------------------------------------------------------- #include #pragma hdrstop #include "Unit2.h" #include "Unit1.h" #pragma package(smart_init) //-------------------------------------------------------------------- // 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 Char1Thread::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } //-------------------------------------------------------------------- __fastcall Char1Thread::Char1Thread(bool CreateSuspended) : TThread(CreateSuspended) { } //-------------------------------------------------------------------- void Char1Thread::SetName() { THREADNAME_INFO info; info.dwType = 0x1000; info.szName = "Char1"; info.dwThreadID = -1; info.dwFlags = 0; __try { RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info ); } __except (EXCEPTION_CONTINUE_EXECUTION) { } } //-------------------------------------------------------------------- void __fastcall Char1Thread::Execute() { SetName(); //---- Place thread code here ---- AnsiString Nouser,msg; int k,j; for(k=0;k<8;k ) { if(Form1->User1[k]==Form1->Username1) { Nouser=IntToStr(k); break; } } Form1->Label2->Caption=Nouser; Form1->Label3->Caption=Form1->Message1; msg="NoUser=" Nouser "\r\nMessage=" Form1->Message2 "\r\n"; for(j=0;j<Form1->x;j ) { Form1->ServerSocket4->Socket->Connections[j]->SendText(msg); } } //-------------------------------------------------------------------- 發表人 - a126154362 於 2004/10/26 12:44:40
okiss
一般會員


發表:11
回覆:55
積分:13
註冊:2002-11-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-03 16:14:20 IP:218.171.xxx.xxx 未訂閱
1。關於這個問題Form1->ServerSocket4->Socket->Connections[j]->SendText(msg); 在Thread的註解中就有提到: // 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 Char1Thread::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } 2。Thread的resume及suspend的次數不一樣。 你可以另外宣告兩個int或bool 如 int Char1Count = 0, Char2Count = 0; 在每一次Char1->resume();時,Char1Count ; 在每一次Char1->suspend();時,Char1Count--; 你就可以知道,次數是否一樣了。 乂乂乂乂乂乂乂乂乂乂乂乂 乂 科技始終來自於人性 乂 乂 人性始終來自於惰性 乂 乂乂乂乂乂乂乂乂乂乂乂乂
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-18 17:33:28 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-19 3:11:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!