1. 程式人生 > >C++ Builder XE8 安卓開發之使用TIdThreadComponent控制元件接收客戶端的資料

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;