_beginthreadex не может преобразовать из перегруженной функции - PullRequest
0 голосов
/ 15 марта 2012

Итак, я делал функцию для печати текста, наложенного на другое окно, и хотел, чтобы он был в отдельном потоке, чтобы я мог запустить таймер для отображения текста, оставляя пользователя открытым для продолжения использования программы. Однако, когда я компилирую, я получаю эту ошибку:

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: (он немного неаккуратный, но работает нормально, и поскольку большинство мониторов обновляются с периодом около 2 мс, sleep (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 ]

3 голосов
/ 15 марта 2012

В двух словах при запуске функции должны следовать точному прототипу, а не тому, который вы использовали.

Они могут принимать функцию, которая занимает одну пустоту *.

Существует несколькорешения.

  1. Измените свою функцию, чтобы принять пустоту *.Сразу же приведите его к «struct *» некоторого типа, который вы создали и который содержит данные, которые вы хотите.Обычно вы создаете структуру в main с помощью new / malloc, а затем удаляете / освобождаете ее, когда она вам не нужна, в функции потока.
  2. Несколько более чистая альтернатива - «новый» объекткласс, который вы сделали.Дайте этому классу публичный статический метод, который принимает void *.Используйте статический метод в качестве начала потока и передайте адрес объекта как «this».Затем статическое преобразование приводит void * к типу объекта и вызывает некоторую подпрограмму 'start / run' для самого объекта.Удалите сам объект перед возвратом из подпрограммы потока, если у вас нет более скоординированного решения между потоками.
2 голосов
/ 15 марта 2012
_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). Отсюда и ошибка и посмотрите на примеры в ссылке.

...