Windows CreateThread в вызове функции класса, сбой ссылки указателя?

Ниже у меня есть int main() и два заголовочных файла, один из которых является классом для создания потока, а другой — классом с именем object который создается внутри windows_thread учебный класс. Это действительно простое упражнение должно вывести 99, а не 1 (по неизвестной причине). Я также попытался использовать указатель на объект, созданный new который разбился, когда void call() из функции Thread_no_1( ) к классу object сделано, может быть, потому что его не существует. Я надеюсь, что кто-то может исправить это, в противном случае я просто буду использовать потоки Windows в int main(),

это главное.

#include "windows_thread.h"
int main()
{
windows_thread* THREAD = new windows_thread();
THREAD->thread();

delete THREAD;

return 0;
}

это windows_thread.h

#include <windows.h>
#include <stdio.h>
#include "object.h"
#define BUF_SIZE 255

class windows_thread
{
object OBJECT;

public:

windows_thread():OBJECT(99)
{
//OBJECT = new object(99);

}
~windows_thread()
{
//delete OBJECT;
}
void thread()
{
std::cout<<"void thread: "<<std::endl;
int Data_Of_Thread_1 = 1;            // Data of Thread 1
HANDLE Handle_Of_Thread_1 = 0;       // variable to hold handle of Thread 1

HANDLE Array_Of_Thread_Handles[1];   // Aray to store thread handles

// Create thread 1.
Handle_Of_Thread_1 = CreateThread( NULL, 0,  Wrap_Thread_no_1, &Data_Of_Thread_1, 0, NULL);
if ( Handle_Of_Thread_1 == NULL)  ExitProcess(Data_Of_Thread_1);

// Store Thread handles in Array of Thread Handles as per the requirement of WaitForMultipleObjects()
Array_Of_Thread_Handles[0] = Handle_Of_Thread_1;// Wait until all threads have terminated.
WaitForMultipleObjects( 1, Array_Of_Thread_Handles, TRUE, INFINITE);

printf("Since All threads executed lets close their handles \n");

// Close all thread handles upon completion.
CloseHandle(Handle_Of_Thread_1);
}
void DisplayMessage (HANDLE hScreen, char *ThreadName, int Data, int Count)
{
TCHAR msgBuf[BUF_SIZE];
size_t cchStringSize;
DWORD dwChars;

// Print message using thread-safe functions.
//StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Executing iteration %02d of %s having data = %02d \n"), Count, ThreadName, Data);
//StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
WriteConsole(hScreen, msgBuf, cchStringSize, &dwChars, NULL);
Sleep(1000);
}
DWORD WINAPI Thread_no_1(  )
{
std::cout<<"Thread_no_1: "<<std::endl;
OBJECT.call();
//OBJECT->call();

return 0;
}
static DWORD WINAPI Wrap_Thread_no_1( LPVOID lpParam )
{
std::cout<<"Wrap_Thread_no_1: "<<std::endl;

windows_thread *self = reinterpret_cast<windows_thread*>(lpParam);
self->Thread_no_1();

return 0;
}
};

следующий объект.h

#ifndef OBJECT_H
#define OBJECT_H

#include <iostream>

class object
{
private:

int value;

public:

object(int value)
{
std::cout<<"object::constructor: "<<std::endl;
this->value = value;
}
~object(){}
void call()
{
std::cout<<"object::call(): begin"<<std::endl;
std::cout<<value<<std::endl;
std::cout<<"object::call(): end"<<std::endl;
}
};
#endif

0

Решение

Вызов этой функции:

Handle_Of_Thread_1 = CreateThread(
NULL,
0,
Wrap_Thread_no_1,
&Data_Of_Thread_1, // <== THIS IS A POINTER TO AN int
0,
NULL
);

Пропуска &Data_Of_Thread_1 (указатель на int) чтобы CreateThread(), Это аргумент, который в конечном итоге передается Wrap_Thread_no_1(),

Внутри этой функции вы затем приводите этот указатель к windows_thread* и вызвать функцию-член через нее. Это вводит Неопределенное поведение в вашем коде.

Вы, вероятно, хотели сделать это вместо этого:

Handle_Of_Thread_1 = CreateThread(NULL, 0,  Wrap_Thread_no_1, this, 0, NULL);
//                                                            ^^^^
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]