2008-11-08 79 views
2

我正在C++ Builder 2009中編寫多線程套接字聊天。
根據我需要做的幾乎完成,但我有一點問題。 我需要將TMemo *指針傳遞到CreateThread WinAPI函數,該函數將其上傳到void *。如何在C++ Builder2009中正確地將指針從void *轉換爲TMemo *?

我tryed這樣:

HANDLE xxx = MemoChat->Handle; 
hNetThread = CreateThread(NULL, 0, NetThread, xxx, 0, &dwNetThreadId); 
//... 

,然後在NetThread功能,

TMemo* MyMemo((HANDLE)lpParam); 
TMemo* MyMemo((TMemo*)lpParam); 

但didn`t工作:(

的問題是我怎麼能真正正確下載它,以便我可以在此新線程中使用我的備忘錄組件?

回答

3

電話:

TMemo*  MemoChat = // You defined that somewhere I assume 
HANDLE  hNetThread = CreateThread(NULL, 0, NetThread, MemoChat, 0, &dwNetThreadId); 

這裏發生的事情是,任何指針傳遞的第三個參數是被自動轉換爲void指針(或在WinTerms LPVOID中)。這很好,它不會改變它,它只是丟失了類型信息,因爲系統不知道你的對象。

新線程的起點:

DWORD NetThread(LPVOID lpParameter) 
{ 
    TMemo* MemoChat = reinterpret_cast<TMemo*>(lpParameter); 
    // Do your thread stuff here. 
} 

一旦你的線程啓動方法被調用。只需將void指針轉換回正確的類型,並且您應該能夠再次開始使用它。

只是爲了澄清其他誤解。

A HANDLE是一個指針
而你可以將它作爲參數傳遞給NetThread()。

手柄是指向在您所使用的對象系統的控制下的指針的指針。那麼爲什麼雙重間接。它允許系統移動對象(並更新其指針),而無需查找對象的所有所有者。業主們都在剛剛更新的指針處理這一點。

這是在因交換主存到二級存儲的OS /硬件能力的現代計算機不經常使用的一個老式的計算機科學概念。但對於某些資源他們仍然有用。如今當需要手柄時,它們被隱藏在遠離用戶的物體內。

2

Pleas理解一個HANDLE是不是一個指針,而是一個Win32 API的概念。因此,第一行將LPVOID轉換爲HANDLE - 這是正確的,因爲線程例程的參數實際上是作爲句柄(xxx)給出的。但是,它繼續將HANDLE轉換爲MyMemo對象;這會處理句柄中的位,就好像它們會形成一個地址 - 它們不是。

第二行完成了完全相同的轉換 - 它將句柄視爲直接作爲指針。

我不知道爲什麼你不及格MemoChat本身螺紋:

hNetThread = CreateThread(NULL, 0, NetThread, MemoChat, 0, &dwNetThreadId); 
+0

把手不是贏32件事。句柄是一個明確的計算機科學概念。它是一個指針指針。第二個指針在系統控制下的位置。因此允許系統動態地移動存儲塊而不影響手柄的持有者。 – 2008-11-08 18:39:07

+0

請參閱http://msdn.microsoft.com/zh-cn/library/ms724457(VS.85).aspx。 「每個句柄在內部維護表中都有一個條目。」 Win32 HANDLE是一般CS句柄概念的具體實現。 – 2008-11-08 19:36:04

+0

我想,那正是我之前說過的! – 2008-11-08 20:53:50

0

這是更多的嘗試和澄清處理與指針的事情,因爲我不認爲馬丁有完全正確的。

「指向指針的指針」實際上被稱爲HANDLE,它是一種常用的CS方法,允許操作系統在物理上移動堆分配的內存塊時,不需要顯式知道應用程序層,而應用程序層總是可以訪問它們通過手柄。經典的68K Mac OS以這種方式工作。以這種方式工作的操作系統通常允許用戶代碼通過句柄分配內存,並直接從堆中分配內存。這種方法用於沒有適當內存管理硬件的機器上。

但是,HANDLE這個詞還有其他一些用法,它們借用了前面使用的一些抽象,但是具有不同的實現。不透明指針(指向用戶不知道的數據結構的指針 - PIMPL成語)通常也稱爲HANDLES。

此外,術語HANDLE可以簡單地用來表示對對象的「引用」 - 可能是數組中的索引。 Unix文件句柄(=文件描述符)就是一個很好的例子。 stdin = 0,stdout = 1,...

那麼,上面哪個是Windows API手柄?我看到了相互矛盾的報道。 This document說:

在Win32中的句柄是用於標識資源或窗口的號碼 。他們 不是指針或指針 指針。把它們想象成ID號碼。

相關問題