This question already has an answer here: problems using CreateThread on a member function                                                                    (1个答案)                                                                                        6年前关闭。                                我试图在类内部创建线程,但出现错误。我只是想知道是否可以解决此问题,还是只能在int main()中使用线程?C:\windows_thread_2\windows_thread_2.cpp||In member function 'void windows_thread::thread()':|C:\windows_thread_2\windows_thread_2.cpp|24|error: argument of type 'DWORD (windows_thread::)(void*)' does not match 'DWORD (*)(void*)'|C:\windows_thread_2\windows_thread_2.cpp||In member function 'DWORD windows_thread::Thread_no_1(void*)':|C:\windows_thread_2\windows_thread_2.cpp|70|warning: deprecated conversion from string constant to 'char*'|||=== Build finished: 1 errors, 1 warnings ===|这是代码。#include <windows.h>//#include <strsafe.h>#include <stdio.h>#define BUF_SIZE 255class windows_thread{//-------------------------------------------------------------------// A function to Display the message indicating in which tread we are//------------------------------------------------------------------- public: windows_thread(){} ~windows_thread(){} void thread() { 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, 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); }//-------------------------------------------// A function that represents Thread number 1//------------------------------------------- DWORD WINAPI Thread_no_1( LPVOID lpParam ) { int Data = 0; int count = 0; HANDLE hStdout = NULL; // Get Handle To screen. Else how will we print? if( (hStdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return 1; // Cast the parameter to the correct data type passed by callee i.e main() in our case. Data = *((int*)lpParam); for (count = 0; count <= 4; count++ ) { DisplayMessage (hStdout, "Thread_no_1", Data, count); } return 0; }};int main(){ windows_thread threading; threading.thread(); return 0;}我根据答案编辑了代码,如果可以解决此错误,请对其进行编辑。line 78 error: no matching function for call to 'windows_thread::Thread_no_1()'|#include <windows.h>//#include <strsafe.h>#include <stdio.h>#define BUF_SIZE 255class windows_thread{//-------------------------------------------------------------------// A function to Display the message indicating in which tread we are//------------------------------------------------------------------- public: windows_thread(){} ~windows_thread(){} void thread() { 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); }//-------------------------------------------// A function that represents Thread number 1//------------------------------------------- DWORD WINAPI Thread_no_1( LPVOID lpParam ) { int Data = 0; int count = 0; HANDLE hStdout = NULL; // Get Handle To screen. Else how will we print? if( (hStdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return 1; // Cast the parameter to the correct data type passed by callee i.e main() in our case. Data = *((int*)lpParam); for (count = 0; count <= 1; count++ ) { //DisplayMessage (hStdout, "Thread_no_1", Data, count); } return 0; } static DWORD WINAPI Wrap_Thread_no_1( LPVOID lpParam ) { windows_thread *self = reinterpret_cast<windows_thread*>(lpParam); self->Thread_no_1(); }};int main(){ windows_thread threading; threading.thread(); return 0;} 最佳答案 线程必须是“普通函数”,而不是对类的非静态成员函数的调用-这些线程需要为“ this-pointer”额外使用“ hidden”参数。由于到目前为止,您的代码没有使用任何成员变量(据我所知),所以简单的解决方案是使函数static。如果要使用类的成员变量或成员函数,则将需要具有静态函数,并将对象(this)作为线程参数的一部分传递给线程,然后使用reinterpret_cast<windows_thread*>(arg);转换回去。遵循以下原则:... Handle_Of_Thread_1 = CreateThread( NULL, 0, Wrap_Thread_no_1, this, 0, NULL);... static DWORD WINAPI Wrap_Thread_no_1( LPVOID lpParam ) { windows_thread *self = reinterpret_cast<windows_thread*>(lpParam); self->Thread_no_1(); }我已经删除了您的原始论点。假设每个对象仅运行一个线程,则可以使其成为成员变量。如果需要带有单独参数的多个线程,则需要将传入的参数设置为struct或class,并将其设置为reinterpret_cast,并将this指针存储为该struct或 [可以是class,因此不需要强制转换]。关于c++ - 类内的CreateThread错误:类型为'DWORD(windows_thread::)(void *)'的参数与'DWORD(*)(void *)'不匹配? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15192648/
10-11 00:56
查看更多