2011-10-27 55 views
1

我認爲我正確地認爲如果我有一個像這樣的程序來設置回調函數。如何讓控制檯程序接受來自回調函數的數據

void MyCallbackFunction(char* data) { 
cout << "some data arrived: " << data << endl; 
} 

int main(){ 
    //sets up callback 
    SetDispatchFunction(&MyCallbackFunction)); 

    while(1==1) { 
    sleep(1000); 
    } 

    return 0; 
} 

那麼,因爲這是一個單線程程序和執行將永遠處理while循環,是沒有辦法的程序來處理MyCallbackFunction處理?

如果是這樣,假設我不想使用多個線程,我有什麼選擇允許處理回調函數?

我決定加入一個真實的例子來演示。

#include <iostream> 

using namespace std; 

#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 


BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 
{ 
    char szText[100] = {0}; 
    GetWindowText(hwndChild, szText, 100); 
    if (lstrlen(szText) < 1) return true; 

    cout << "Window text: " << szText << endl; 

    return TRUE; 
} 

int main(int argc, char* argv[]) 
{ 
    //latch onto Google Chrome if running 
    HWND windowHandle = FindWindow("Chrome_WidgetWin_0", 0); 

    if(windowHandle) 
     EnumChildWindows(windowHandle, EnumChildProc, 0); 


    //loop so program doesn't stop 
    while(1==1) { 
     Sleep(2000); 
    } 

    return 0; 
} 
+1

什麼是'SetDispatchFunction'? –

回答

1

回調函數通常被調用通過您註冊的實體衍生線程,您將需要某種形式的一個信號機制,由你做你的主線程知道回調的。總是建議不要在線程中執行處理,而應該切換上下文並在其自己的線程中執行處理。

只是考慮作爲一個例子:
郵件上的主線程塊隊列(或定期檢查相同),等待讀取消息,並在回調函數中向此消息隊列發佈消息。

您也可以使用全局受同步保護來實現沒有消息隊列的類似功能。然而,如果你的程序是嚴格單線程的,那麼在某個時間點,while循環將被中斷,並且回調函數將被執行,其中你可以設置一個全局變量,然後可以通過這個全局變量進行檢查當它被打斷。當然,同步將是必要的。

+0

我正在尋找輕量級的解決方案。例如,我怎樣才能用計時器實現同樣的事情呢? –

相關問題