2012-03-15 23 views
0

所以我正在製作一個函數來打印跨越不同窗口的文本,並且我希望它位於一個單獨的線程中,因此我可以運行一個計時器來顯示正在顯示的文本用戶打開繼續使用該程序。然而,當我編譯我得到這個錯誤:_beginthreadex不能從'重載函數'轉換

error C2664: '_beginthreadex' : cannot convert parameter 3 from 'overloaded-function' to 'unsigned int (__stdcall *)(void *)' 

這裏的主CPP文件:

#include "stdafx.h" 
#include "Trial.h" 

int main() 
{ 
wchar_t* text = L"Message!"; 
HWND hwnd = FindWindowW(0, L"Halo"); 
unsigned threadID; 
_beginthreadex(0, 0, DrawText,(void *)(hwnd, 175, 15, text, 8), 0 , &threadID); 
// Other function here 
} 

而這裏的頭文件Trial.h:(這是一個有點草率,但工作正常,因爲大多數顯示器都在2ms左右更新,睡眠(2)應該有助於防止閃爍)。

#pragma once  
#include <Windows.h> 
#include <string> 
#include <process.h> 

void DrawText(HWND hWnd, float x, float y, wchar_t* mybuffer, float DisplayTime) 
{ 
SetForegroundWindow(hWnd); 
HDC hdc = GetDC(hWnd); 
SetBkColor(hdc,RGB(255, 255, 255));     // While Background color... 
SetBkMode(hdc, TRANSPARENT);      // Set background to transparent so we don't see the white... 

int howmany = sizeof(mybuffer) * 2; 

DisplayTime *= 500; 
int p = 0; 
while(p < DisplayTime) 
{ 
      // Shadow Offset 
    SetTextColor(hdc,RGB(0, 0, 0)); 
    TextOut(hdc,x+2,y+2, (LPCWSTR)mybuffer,howmany); 

    // Primary text 
    SetTextColor(hdc,RGB(255, 0, 0)); 
    TextOutW(hdc,x,y,(LPCWSTR)mybuffer,howmany); 

    UpdateWindow(hWnd); 
    p++; 
    Sleep(2); 
} 
ReleaseDC(hWnd,hdc); 
_endthreadex(0); 
} 

我已經通過多個例子看,檢查語法,並確信,我沒惹起來的_beginthreadex,但似乎無法找到問題的原因:|

回答

2

簡而言之,線程啓動功能需要遵循確切的原型,而不是您使用的原型。

他們可以接受一個函數,只需要一個void *。

有幾種解決方案。

  1. 改變你的函數接受void *。馬上將其轉換爲您創建的某種類型的「struct *」,並擁有您想要的數據。你通常會用new/malloc在main中創建struct,然後在線程函數中不需要它時刪除/釋放它。
  2. 稍微乾淨一些的選擇是爲您創建的課程的對象「新建」。爲該類提供一個公共靜態方法,該方法使用void *。使用靜態方法作爲線程啓動器,並將對象的地址作爲「this」傳遞。然後讓靜態將void *轉換爲對象類型,並在對象上調用一些「啓動/運行」例程。在從線程例程返回之前讓對象自己刪除,除非在線程中有更協調的解決方案。
+0

謝謝。我想我沒有讀完msdn足夠接近。我剛剛看到了arglist,並從那裏出發。 – Tox1k 2012-03-15 04:58:05

1
_beginthreadex(0, 0, DrawText,(void *)(hwnd, 175, 15, text, 8), 0 , &threadID); 

根據MSDN,第三個參數必須是指向其參數是void*類型的函數。在你的情況下,DrawText是一個函數,其參數不是void*,而是(HWND hWnd, float x, float y, wchar_t* mybuffer, float DisplayTime)。因此,錯誤並查看鏈接中的示例。