我是C的初学者,尤其是线程。
我需要@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_main);
}
并使用后来在malloc
中使用的HANDLE
动态数组。
我现在做的事情:
WaitForMultipleObjects
然后循环:
int i = 0 ;
HANDLE ThreadHandlers = (HANDLE)malloc(sizeof(HANDLE)* List->logicalLength);
但是当我尝试编译时,我得到了:
IntelliSense:expression必须是指向完整对象类型的指针
我的理解是因为while(curr!= NULL)
{
ThreadHandlers[i]= createtestThread((LPTHREAD_START_ROUTINE)executeTest,(TestStruct*)(curr->data),ThreadIds+i);
curr = curr->next;
//ThreadHandlers[i] =
i++;
}
WaitForMultipleObjects(
List->logicalLength,
ThreadHandlers,
TRUE, /* wait until all threads finish */
INFINITE);
是typedef HANDLE
而且我不能用void*
来做逻辑。
可以采取哪些解决方法?
进行这种编程的正确方法是什么? (等待未知数量的线程)
答案 0 :(得分:2)
这一行:
HANDLE ThreadHandlers = (HANDLE)malloc(sizeof(HANDLE)* List->logicalLength);
应该是这样的:
HANDLE* ThreadHandlers = (HANDLE*)malloc(sizeof(HANDLE) * List->logicalLength);
以上修复将解决有关WaitForMultipleObjects的编译问题。
虽然我在这里,但这条线看起来很可疑:
ThreadHandlers[i]= createtestThread((LPTHREAD_START_ROUTINE)executeTest,(TestStruct*)(curr->data),ThreadIds+i);
我认为createtestthread是CreateThread或_beginthreadex的包装器。但是如果你必须明确地将你的函数显式地转换为LPTHREAD_START_ROUTINE,你可能做错了。删除演员表,使这一行成为:
ThreadHandlers[i]= createtestThread(executeTest,(TestStruct*)(curr->data),ThreadIds+i);
然后,如果仍然导致新的编译器错误,请修复executeTest的声明,使其声明如下:
DWORD __stdcall executeTest(void* pData);
将不同签名的功能强制转换为CreateThread将导致以后出现奇怪的问题。
答案 1 :(得分:2)
你在创建句柄数组时犯了一个错误,你应该做的是:
HANDLE *ThreadHandlers = (HANDLE*)malloc(sizeof(HANDLE) * List->logicalLength);
就你的第二个问题而言,使用WaitForMultipleObjects
是等待未知数量线程的正确方法。根据情况,如果您只想等待一个线程发出信号,或者如果您想在一段时间后停止等待,则可以将一些超时间隔作为第四个参数传递给第三个参数。