_beginthreadex无法从'overloaded-function'转换

时间:2012-03-15 04:35:13

标签: c++ multithreading 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 个答案:

答案 0 :(得分:3)

简而言之,启动函数需要遵循精确的原型,而不是您使用的原型。

他们可以接受一个带有单个空格*的函数。

有几种解决方案。

  1. 更改您的功能以接受空*。马上将它投射到一个结构*&#39;您创建的某种类型,并拥有您想要的数据。您通常使用new / malloc在main中创建结构,然后在线程函数中不需要它时删除/释放它。
  2. 更清洁的替代方案是“新”&#39;你所做的课程的对象。给该类一个公共静态方法,该方法接受所述void *。使用静态方法作为线程启动器,并将对象的地址作为&#39; this&#39;。然后让静态将void *转换为对象类型并调用一些&#39; start / run&#39;对象的例行程序。除非在线程之间有更协调的解决方案,否则在从线程例程返回之前让对象自行删除。

答案 1 :(得分:2)

_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)。因此错误并查看链接中的示例。