欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
漫談C++ Builder多線(xiàn)程編程技術(shù)

漫談C++ Builder多線(xiàn)程編程技術(shù)

  摘 要:本文簡(jiǎn)單介紹了Windows環(huán)境下進(jìn)行多線(xiàn)程編程的意義,重點(diǎn)討論了C++Builder環(huán)境下開(kāi)發(fā)多線(xiàn)程應用程序這一問(wèn)題,并通過(guò)實(shí)現生產(chǎn)者-消費者問(wèn)題,幫我們更好地理解同步概念及其實(shí)現方法。
 
  線(xiàn)程之可行性
 
  在很多情況下,可能需要為程序創(chuàng )建線(xiàn)程。這里給出其中一些可能性:
 
 ?。?)如果創(chuàng )建的是一個(gè)多文檔接口(Multiple Document Interface,MDI)程序,那么為每個(gè)窗口分配一個(gè)線(xiàn)程就顯得十分重要了,例如,對于一個(gè)通過(guò)多個(gè)Modem同時(shí)連接到多個(gè)主機的MDI通信程序而言,如果每個(gè)窗口都有它自己的線(xiàn)程來(lái)和一個(gè)主機通信,那么整個(gè)事情就簡(jiǎn)化很多。
 
 ?。?)如果使用的是一臺有多個(gè)處理器的機器,并希望充分利用所有可能獲得的CPU資源,那么就需要將應用程序分解成多個(gè)線(xiàn)程。Windows2000中CPU的劃分單位為線(xiàn)程。因此,如果程序只包含一個(gè)線(xiàn)程,那么,默認環(huán)境下該程序只能使用其中一個(gè)CPU.但是,如果將此程序劃分為多個(gè)線(xiàn)程,那么Windows2000就可以在不同的CPU上運行各個(gè)線(xiàn)程。
 
 ?。?)在后臺運行的某些任務(wù)的同時(shí),要求用戶(hù)還可以繼續使用應用程序進(jìn)行工作。利用線(xiàn)程很容易實(shí)現這點(diǎn)。例如:可以將一些冗長(cháng)的重算、頁(yè)面格式化操作、文件的讀寫(xiě)等活動(dòng)都放在單獨的線(xiàn)程中,使其在后臺運行,而不會(huì )對用戶(hù)造成影響。
 
  同步
 
  撰寫(xiě)多線(xiàn)程程序的一個(gè)最具挑戰性的問(wèn)題就是:如何讓一個(gè)線(xiàn)程和另一個(gè)線(xiàn)程合作。這引出了一個(gè)非常重要的問(wèn)題:同步。所謂同步是指進(jìn)程、線(xiàn)程間相互通信時(shí)避免破壞各自數據的能力。Windows環(huán)境下的同步問(wèn)題是由Win32系統的CPU時(shí)間片分配方式引起的。雖然在某一時(shí)刻,只有一個(gè)線(xiàn)程占用CPU(單CPU)時(shí)間,但是無(wú)法知道在什么時(shí)候,在什么地方線(xiàn)程被打斷,這樣如何保證線(xiàn)程之間不破壞彼此的數據就顯得格外重要。同步問(wèn)題是如此重要,也相當有趣,因而吸引了不少學(xué)者對他進(jìn)行研究,由此產(chǎn)成了一系列經(jīng)典的進(jìn)程同步問(wèn)題,其中較有代表性的是"生產(chǎn)者-消費者問(wèn)題"、"讀者-寫(xiě)者問(wèn)題""哲學(xué)家進(jìn)餐問(wèn)題"等。在此,本文簡(jiǎn)要討論了C++Builder平臺下如何利用多線(xiàn)程編程技術(shù)實(shí)現"生產(chǎn)者-消費者"問(wèn)題,幫助我們更好得理解同步概念及其實(shí)現方法。
 
  生產(chǎn)者-消費者問(wèn)題
 
  生產(chǎn)者-消費者問(wèn)題是一個(gè)著(zhù)名的進(jìn)程同步問(wèn)題。它描述的是:有一群生產(chǎn)者進(jìn)程在生產(chǎn)消息,并將此消息提供給消費者進(jìn)程去消費。為使生產(chǎn)者進(jìn)程和消費者進(jìn)程能并發(fā)進(jìn)行,在他們之間設置了一個(gè)具有N個(gè)緩沖區的緩沖池,生產(chǎn)者進(jìn)程可以將它所生產(chǎn)的消息放入一個(gè)緩沖區中,消費者進(jìn)程可以從一個(gè)緩沖區中取得一個(gè)消息消費。盡管所有的生產(chǎn)者進(jìn)程和消費者進(jìn)程都是以異步方式進(jìn)行的,但他們之間必須保持同步,即不允許消費者進(jìn)程到一個(gè)空的緩沖區中去取消息,也不允許生產(chǎn)者進(jìn)程向一個(gè)已裝滿(mǎn)消息且尚未被取走消息的緩沖區中投放消息。
 
  C++Builder多線(xiàn)程應用程序編程基礎
 
  1、使用C++Builder提供的TThread類(lèi)
 
  VCL類(lèi)庫提供了用于線(xiàn)程編程的TThread類(lèi)。在TThread類(lèi)中封裝了Windows中關(guān)于線(xiàn)程機制的WindowSAPI.對于大多數的應用程序來(lái)說(shuō),可在應用程序中使用線(xiàn)程對象來(lái)表示執行線(xiàn)程。線(xiàn)程對象通過(guò)封裝使用線(xiàn)程所需的內容,簡(jiǎn)化了多線(xiàn)程應用程序的編寫(xiě)。注意,線(xiàn)程對象不允許控制線(xiàn)程堆棧的大小或其安全屬性。若需要控制這些,必須使用WindowsAPI的Create Thread()或Begin Thread()函數。
 
  TThread類(lèi)有以下一些屬性和方法:
 1) 屬性:

  ·Priority:優(yōu)先級屬性??梢栽O置線(xiàn)程的優(yōu)先級。

  ·Return Value:返回值屬性。當線(xiàn)程介紹時(shí)返回給其他線(xiàn)程一個(gè)數值。

  ·Suspended:掛起屬性??梢耘袛嗑€(xiàn)程是否被掛起。

  ·Terminated:結束屬性。用來(lái)標志是否應該結束線(xiàn)程。

  ·ThreadID:標識號屬性。在整個(gè)系統中線(xiàn)程的標識號。使用Windows API函數時(shí)該屬性非常有用。

  2) 方法:

  ·Do Terminate:產(chǎn)生一個(gè)On Terminate事件,但是不結束線(xiàn)程的執行。

  ·Resume:?jiǎn)拘岩粋€(gè)線(xiàn)程繼續執行。

  ·Suspend:掛起一個(gè)線(xiàn)程,要與Resume過(guò)程成對使用。

  ·Synchronize:由主VCL線(xiàn)程調用的一個(gè)同步過(guò)程。

  ·Terminate:將Terminate屬性設置為T(mén)rue,中止線(xiàn)程的執行。

  ·Wait For:等待線(xiàn)程的中止并返回Return Value屬性的數值。


  2、協(xié)調線(xiàn)程
 
  在編寫(xiě)線(xiàn)程執行時(shí)運行的代碼時(shí),必須考慮到可能同步執行的其他線(xiàn)程的行為。特別注意,避免兩個(gè)線(xiàn)程試圖同時(shí)使用相同的全局對象或變量。另外,一個(gè)線(xiàn)程中的代碼會(huì )依賴(lài)其他線(xiàn)程執行任務(wù)的結果。
 
  1) 避免同時(shí)訪(fǎng)問(wèn)
 
  為避免在訪(fǎng)問(wèn)全局對象或變量時(shí)與其他線(xiàn)程發(fā)生沖突,可能需要暫停其他線(xiàn)程的執行,直到該線(xiàn)程代碼完成操作。
 
 ?。?)鎖定對象。一些對象內置了鎖定功能,以防止其他線(xiàn)程使用該對象的實(shí)例。例如,畫(huà)布對象(TCanvas及其派生類(lèi))有一種Lock()函數可以防止其他線(xiàn)程訪(fǎng)問(wèn)畫(huà)布,直到調用Unlock()函數。顯然,這種方法只對部分類(lèi)有效。
 
 ?。?)使用重要區段。

    若對象沒(méi)有提供內置的鎖定功能,可使用重要區段。重要區段像門(mén)一樣,每次只允許一個(gè)線(xiàn)程進(jìn)入,要使用重要區段,需創(chuàng )建TCriticalSection的全局實(shí)例。TCriticalSection有兩個(gè)函數:Acquire()(阻止其他線(xiàn)程執行該區域)及Release()(取消對其他線(xiàn)程的阻止)。
 
 ?。?)使用多重讀、獨占寫(xiě)的同步器。

    當使用重要區段來(lái)保護全局內存時(shí),每次只有一個(gè)線(xiàn)程可以使用該內存。這種保護可能會(huì )超出了需要,特別是有一個(gè)經(jīng)常讀但很少寫(xiě)的對象或變量時(shí)更是如此。多個(gè)線(xiàn)程同時(shí)讀相同內存但沒(méi)有線(xiàn)程寫(xiě)內存是沒(méi)有危險的。當有一些經(jīng)常被讀,但是很少寫(xiě)的全局變量時(shí),可用TMultiReadExclusiveWriteSynchronizer對象保護它。這個(gè)對象和重要區段一樣,但它允許多個(gè)線(xiàn)程同時(shí)讀,只要沒(méi)有線(xiàn)程寫(xiě)即可。每個(gè)需要讀內存的線(xiàn)程首先要調用Begin Read()函數(確保當前無(wú)其他線(xiàn)程寫(xiě)內存),線(xiàn)程完成對保護內存讀操作后,要調用End Read()函數。任何線(xiàn)程需要寫(xiě)保護內存必須調用Begin Write()函數(確保當前無(wú)其他線(xiàn)程讀或寫(xiě)內存),完成對保護內存寫(xiě)操作后,調用End Write()函數。
 
 ?。?)使用Synchronize函數:Void __fast call Synchronize (TThreadMethod &Method);
 
  其中參數Method為一個(gè)不帶參數的過(guò)程名。在這個(gè)不帶參數的過(guò)程中是一些訪(fǎng)問(wèn)VCL的代碼。我們可以在Execute過(guò)程中調用Synchronize過(guò)程來(lái)避免對VCL的并發(fā)訪(fǎng)問(wèn)。程序運行期間的具體過(guò)程實(shí)際上是由Synchronize過(guò)程來(lái)通知主線(xiàn)程,然后主線(xiàn)程在適當的時(shí)機來(lái)執行Synchronize過(guò)程的參數列表中的那個(gè)不帶參數的過(guò)程。在多個(gè)線(xiàn)程的情況下,主線(xiàn)程將Synchronize過(guò)程發(fā)過(guò)來(lái)的通知放到消息隊列中,然后逐個(gè)地響應這些消息。通過(guò)這種機制Synchronize實(shí)現了線(xiàn)程之間地同步。
2) 等待其他線(xiàn)程
 
  若線(xiàn)程必須等待另一線(xiàn)程完成某項任務(wù),可讓線(xiàn)程臨時(shí)中斷執行。然后,要么等待另一線(xiàn)程完全執行結束,要么等待另一線(xiàn)程通知完成了該任務(wù)。
 
  (1)等待線(xiàn)程執行結束
 
  要等待另一線(xiàn)程執行結束,使用它地Wait For()函數。Wait For函數直到那個(gè)線(xiàn)程終止才返回,終止的方式要么完成了其Execute()函數,要么由于一個(gè)異常。
 
  (2)等待任務(wù)完成。

    有時(shí),只需要等待線(xiàn)程完成一些操作而不是等待線(xiàn)程執行結束。為此,可使用一個(gè)事件對象。事件對象(TEvent)應具有全局范圍以便他們能夠為所有線(xiàn)程可見(jiàn)。當一個(gè)線(xiàn)程完成一個(gè)被其他線(xiàn)程依賴(lài)的操作時(shí),調用TEvent::Set Event()函數。Set Event發(fā)出一個(gè)信號,以便其他線(xiàn)程可以檢查并得知操作完成。要關(guān)掉信號,則使用Reset Event()函數。
 
  例如,當必須等待若干線(xiàn)程完成其執行而不是單個(gè)線(xiàn)程時(shí)。因為不知道哪個(gè)線(xiàn)程最后完成,也就不能對某個(gè)線(xiàn)程使用Wait For()函數。此時(shí),可通過(guò)調用Set Event以在線(xiàn)程結束時(shí)累加計數值并在最后一個(gè)線(xiàn)程結束時(shí)發(fā)出信號以指示所有線(xiàn)程結束。
 
  多線(xiàn)程應用程序編程實(shí)例
 
  下面是一個(gè)實(shí)現"生產(chǎn)者-消費者問(wèn)題"的多線(xiàn)程應用實(shí)例。在此例中,我們按上面介紹的方法構造了兩個(gè)TThread的子類(lèi)TProducerThread(生產(chǎn)者線(xiàn)程)和TCustomerThread(消費者線(xiàn)程),生產(chǎn)和消費的商品僅僅是一個(gè)整數。在協(xié)調生產(chǎn)和消費的過(guò)程中,重要區段(TCriticalSection)和事件(TEvent)得到了應用。生產(chǎn)者通過(guò)TEvent類(lèi)的對象Begin Consume來(lái)通知消費者開(kāi)始消費,而消費者通過(guò)TEent類(lèi)的對象Begin Produce通知生產(chǎn)者開(kāi)始生產(chǎn)。程序中共有兩個(gè)生產(chǎn)者,一個(gè)消費者。在兩個(gè)生產(chǎn)者之間,通過(guò)TCriticalSection類(lèi)的對象同步。其運行界面如圖1所示。
 


圖1 程序運行效果

  主要源程序如下所示:
 
  生產(chǎn)者線(xiàn)程:
 

 Void __fast call TProducerThread:: Execute ()
{
 //---- Place thread code here ----
 Int i = 0;
 Int j;
 while(i<100) //每個(gè)生產(chǎn)者線(xiàn)程生產(chǎn)100個(gè)商品
 {
  Sleep(1000);//延遲,為清楚得顯示執行效果
  if(Form1->buffer_size > 0)//緩沖池不空,通知消費者消費
  {
   Form1->Begin Consumer->Set Event ();
 }
 Form1->Produce Guard->Acquire ();
 i++;
 StrResult = IntToStr (i);
 J = Form1->buffer_size;
 Form1->Product [j] = i;
 Form1->buffer_size++;
 Synchronize(Show Result);//刷新界面,顯示最新生產(chǎn)-消費狀況
 Form1->Begin Consumer->Set Event();//通知消費者消費
 if(Form1->buffer_size == 5)//緩沖池滿(mǎn),掛起生產(chǎn)者線(xiàn)程,直到通知再生產(chǎn)
 {
  Form1->Begin Produce->Wait For (INFINITE);
 }
 Sleep (1000);
 Form1->Produce Guard->Release ();
}
While (Form1->buffer_size > 0)
{
 Form1->Begin Consumer->Set Event ();
}
}

  消費者線(xiàn)程:
 

 

 

 Void __fast call TConsumerThread::Execute()
{
 //---- Place thread code here ----
 Int j;
 For (int i = 0;i < 200;i++)
 {
  Sleep(100); //延遲,為清楚得顯示執行效果
  Form1->Begin Consumer->Wait For(INFINITE);//掛起消費者線(xiàn)程,直到通知再消費
  J = Form1->buffer_size - 1;
  StrResult = IntToStr (Form1->Product [j]);
  Form1->buffer_size--;
  Synchronize(Show Result); //刷新界面,顯示最新生產(chǎn)-消費狀況
  if(Form1->buffer_size == 4)//緩沖池不再full,喚醒由于緩沖池full而掛起的生產(chǎn)者線(xiàn)程
  {
   Form1->Begin Produce->Set Event ();
  }
  Sleep (100);
 }
}

  結論
 
  本文討論了多線(xiàn)程編程及其可行性,說(shuō)明了在Windows環(huán)境下進(jìn)行多線(xiàn)程編程的意義,并重點(diǎn)討論了C++Builder平臺下如何開(kāi)發(fā)多線(xiàn)程應用程序這一問(wèn)題,通過(guò)實(shí)現"生產(chǎn)者-消費者問(wèn)題"這一著(zhù)名的進(jìn)程同步問(wèn)題,比較清晰地反映了在Windows環(huán)境下進(jìn)行多線(xiàn)程編程技術(shù)及其實(shí)現的作用和效果。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
delphi多線(xiàn)程編程
Delphi+多線(xiàn)程
QWorker專(zhuān)題-基于作業(yè)的Delphi/C++ Builder并行編程框架
用Delphi實(shí)現多線(xiàn)程數據采集
用多線(xiàn)程進(jìn)行數據采集
LabVIEW編程之生產(chǎn)者消費者架構
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久