Ошибка параметра CreateThread - PullRequest
       1

Ошибка параметра CreateThread

0 голосов
/ 04 января 2012

Не уверен, что не так с параметром 3 или настройкой?

error C2440: 'type cast' : cannot convert from '' to 'unsigned long (__stdcall *)(void *)'
        None of the functions with this name in scope match the target type

-

void CNumbergeneratorDlg::OnBtn3()
{
    //CreateThread
    hThread1 = CreateThread(NULL, 0, Thread1, this, 0, NULL);//<--is "this" correct

    WaitForSingleObject(hThread1,INFINITE);
    TerminateThread(hThread1,0);
    CloseHandle(hThread1);
}

DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue)
{
    CreateNumber();
    return 0;
}

???кастинг для "этого"

DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue)
{
    (CDialog)iValue->CreateNumber();
    return 0;
}

хххххххххххх ххххххххххххх

Это то, что я сделал с твоими парнями ... спасибо

    void CNumbergeneratorDlg::OnBtn3()
{
    //CreateThread
    CNumbergeneratorDlg *pp = this;
    hThread1 = CreateThread(NULL, 0, Thread1, pp, 0, NULL);

//  WaitForSingleObject(hThread1,INFINITE);
//  TerminateThread(hThread1,0);
//  CloseHandle(hThread1);
}

DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue)
{
    CNumbergeneratorDlg *pp = (CNumbergeneratorDlg*)iValue;

    pp->CreateNumber();
    return 0;
}

void CNumbergeneratorDlg::CreateNumber()
{
    long m;
    j = 0;
    for(long i = 0; i < 1000;i++){
        m = 0;
        for(long k = 0; k < 1000000;k++){
            m ++;
        }

        j++;
    }

    AfxMessageBox("Done count");
    TerminateThread(hThread1,0);
    CloseHandle(hThread1);
}

void CNumbergeneratorDlg::OnBtn4()
{

    TerminateThread(hThread1,0);
    CloseHandle(hThread1);

    CString c;
    c.Format("%d", j);
    MessageBox(c);
}

Ответы [ 3 ]

3 голосов
/ 04 января 2012

Вы пытаетесь передать CreateThread метод класса, который не имеет ожидаемой подписи. Первый аргумент всех методов - это тот же тип указателя this, в случае Thread1 - CNumbergeneratorDlg *.

Вы должны:

  • Сделать метод Thread1 статическим или
  • Переместите его за пределы класса.

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

http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr039.htm

Вот статья, которая может быть полезна при использовании CreateThread:

http://adilevin.wordpress.com/2009/06/07/createthread-an-example/

Я также предлагаю вам прочитать следующее, чтобы понять соглашения о вызовах (бит «__stdcall»):

http://msdn.microsoft.com/en-us/library/zxk0tw93(v=vs.80).aspx

2 голосов
/ 04 января 2012

Thread1 является нестатической функцией-членом. Для вызова требуется экземпляр вашего класса (CNumbergeneratorDlg). Вот почему вы получаете эту ошибку.

Вы можете сделать Thread1 статическим и передать this параметром при создании потока:

class CNumbergeneratorDlg {
    void OnBtn3() {
        hThread1 = CreateThread(NULL, 0, Thread1, this, 0, NULL);
        // ...
    }
public:
    static DWORD Thread1(LPVOID lpdwThreadParam) {
        CNumbergeneratorDlg *instance =
            static_cast<CNumbergeneratorDlg *>(lpdwThreadParam);
        // do something with instance.
    }
};
0 голосов
/ 04 января 2012

Вы объявили функцию Thread1 как static функцию-член в CNumbergeneratorDlg? Если нет, пожалуйста, сделайте это.

Нестатические функции класса имеют неявный дополнительный параметр для this. Таким образом, приведение типов не будет работать. С другой стороны, статические методы не содержат параметр this.

Тогда вам может быть интересно, как вы можете получить доступ к ученикам внутри Thread1. Типичная техника прохождения this через iValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...