C++ Builder XE8 安卓開發之使用TIdThreadComponent控制元件接收客戶端的資料
C++ Builder中自帶了indy10控制元件,由於indy10的TCPClient接收方式是阻塞式的,所以需要一個執行緒來接收資料。
indy10本身有一個執行緒控制元件:
把它放在介面中就可以使用了。
我是在OnRun函式中新增自己的程式碼,雖然可以成功執行,但不知道是否規範。程式碼如下:
void __fastcall THeaderFooterForm::TCPClientRecThreadRun(TIdThreadComponent *Sender) { //判斷是否建立連線 if(!TCPClient->Connected()) { return; } //判斷InputBuffer是否為空 if(TCPClient->IOHandler->InputBufferIsEmpty()) { return; } len = TCPClient->IOHandler->InputBuffer->Size; //獲取接收資料的長度 StrBuf = TCPClient->IOHandler->ReadString(len); //一次性讀取len位元組 MemoDisplay->Lines->Add(StrBuf); //顯示接收到的資料 }
擴充套件資料:TIdThreadComponent元件介紹(摘自《Delphi7元件應用例項》P475)
TIdThreadComponent元件是TIdCustomThreadComponent子類,使用一個執行執行緒實現一個可使元件。
1.屬性
(1)Active:指定元件內部執行緒是否正在執行。
(2)Priority:指定元件內部執行緒的排程優先順序。
(3)StopMode:指定元件內部執行緒的Stoped屬性值為True時系統的行為。
2.方法
(1)Create:建立並初始化一個TIdThreadComponent物件例項。
(2)Destroy:釋放TIdThreadComponent物件例項。
(3)Start:啟動或恢復元件的內部執行緒的執行。
(4)Stop:中斷元件的內部執行緒的執行。
(5)Synchroize:在主應用程式執行緒中執行一個執行緒或程式方法,
(6)Terminate:請求終止元件內部執行緒的執行。
(7)TerminateAndWaitFor:組合Terminate和WaitFor方法,請求並等待元件內部執行緒的終止。
(8)WaitFor:等待直至執行緒執行完畢。
3.事件
(1)OnAfterExecute:執行緒執行完成時觸發該事件。
(2)OnAfterRun:執行緒被中斷,但仍可能再度恢復時觸發該事件。
(3)OnBeforeExecute:執行緒將要進入內部控制迴圈時觸發該事件。
(4)OnBeforeRun:執行緒將要在內部控制迴圈中執行迭代時觸發該事件。
(5)OnCleanup:執行緒執行CleanUp方法時觸發該事件。
(6)OnException:執行緒執行過程中出現異常時觸發該事件。
(7)OnRun:執行緒開始執行時觸發該事件。
(8)OnStoped:執行緒被停止時觸發該事件。
(9)OnTerminate:執行緒終止時觸發該事件。
另外附上一個自己寫的Demo程式片段:
//Button1單擊事件
procedure TForm1.Button1Click(Sender: TObject);
begin
//IdThreadComponent1.Active := true; //啟動執行緒
IdThreadComponent1.Start; //和上一條語句一樣的效果
end;
//OnRun事件
procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
begin
inc(i); //i++
IdThreadComponent1.Synchronize(display); //使用Synchronize方法呼叫VCL控制元件,不然會卡頓甚至宕機
//IdThreadComponent1.Active := false; //停止執行緒執行
IdThreadComponent1.Terminate; //結束執行緒,並進入OnTerminate事件,不然會反覆執行執行緒
end;
//顯示函式
procedure TForm1.display();
begin
Memo1.Lines.Add('display:' + IntToStr(i));
end;