线程创建有问题..大侠指点

imillo19881010 2011-02-10 10:11:06

#include <windows.h>
#include <stdio.h>

typedef BOOL(* PrinLog)(char *, DWORD);
PrinLog PrinLogDll = NULL;

//HINSTANCE hDllInst;
DWORD WINAPI Thread(LPVOID)
{
char szLog_thir[MAX_PATH] = {"\0"};
sprintf(szLog_thir,"Thread call PrinLogDll Function!");
PrinLogDll(szLog_thir, (strlen(szLog_thir)+1));
return 0;
}

BOOL main()
{

HINSTANCE hDllInst;
hDllInst = LoadLibrary("E:\\sourcesafe\\PrintLogDll\\Debug\\PrintLogDll.dll");
if (hDllInst == NULL)
{
printf("Load Library failed,GLE=%d\n",GetLastError());
return FALSE;
}
else
{
PrinLogDll = (PrinLog)GetProcAddress(hDllInst, "PrinLogDll");
}
HANDLE hThread[5];
for (int i= 0; i < 5; i++)
{
hThread[i] = CreateThread( NULL, 0, Thread, NULL,0, NULL);
if (hThread == INVALID_HANDLE_VALUE)
{
printf("CreateThread is failed,GLE=%d",GetLastError());
}
//Sleep(200);
}
WaitForMultipleObjects(5, hThread, FALSE, INFINITE);
FreeLibrary(hDllInst);
return TRUE;
}



总是会抛例外,小妹是在不知是何原因...
...全文
149 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
imillo19881010 2011-02-10
  • 打赏
  • 举报
回复
我设置信号量了,不是应该互斥的写文件么,为什么会出现Create file failed,GLE=32的错误?
imillo19881010 2011-02-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 challeng_everything 的回复:]
ReleaseSemaphore(hSemaphore, 1, NULL);
应该要在PrinLogDll函数的每一个return之前调用,否则会造成互斥变量没有释放致使其他线程的线程函数获取不到该互斥变量而停在那
[/Quote]
那我的release 没有问题呀
阿茶你在哪里 2011-02-10
  • 打赏
  • 举报
回复
你可以把断点射到导出函数里,然后将程序的启动参数设置为主程序的exe,这样调试一下你的PrinLogDll里面是否有问题。
阿茶你在哪里 2011-02-10
  • 打赏
  • 举报
回复
ReleaseSemaphore(hSemaphore, 1, NULL);
应该要在PrinLogDll函数的每一个return之前调用,否则会造成互斥变量没有释放致使其他线程的线程函数获取不到该互斥变量而停在那
imillo19881010 2011-02-10
  • 打赏
  • 举报
回复

extern "C" _declspec(dllexport)BOOL PrinLogDll(char *lpszLog, DWORD dwLogSizes)
{
WaitForSingleObject(hSemaphore, INFINITE);
//printf("%s",szLogName);
DWORD dwWriteFile = 0;
BOOL fSucess = FALSE;
DWORD dwFileSize = 0;
DWORD dwWriteSize = 0;
BOOL bwrtSucess = FALSE;
char szPrinLog[MAX_PATH] = {"\0"};
HANDLE hFile = NULL;
//dwFileSize = GetFileSize(g_hFile, NULL);
hFile = CreateFile(g_szLogName, GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE )
{
printf("Create file failed,GLE=%d\n",GetLastError());
return FALSE;
}
dwFileSize = GetFileSize(hFile, NULL);
SYSTEMTIME stLocal;
char szCrtTime[MAX_PATH] = {"\0"};
char szLogPrint[MAX_PATH] = {"\0"};
GetLocalTime(&stLocal);
sprintf(szCrtTime, "%d/%d/%d %d:%d", stLocal.wYear,
stLocal.wMonth, stLocal.wDay,
stLocal.wHour, stLocal.wMinute,stLocal.wMinute);
sprintf(szLogPrint,"%s\t\t%s\t\t",szCrtTime,lpszLog);
printf("%s\n",szLogPrint);
fSucess = WriteFile(hFile, szLogPrint, (dwLogSizes + strlen(szCrtTime)+1),
&dwWriteFile, NULL);
if (!fSucess)
{
printf("Write file failed, GLE=%d",GetLastError());
CloseHandle(hFile);
return FALSE;
}
CloseHandle(hFile);
ReleaseSemaphore(hSemaphore, 1, NULL);
return TRUE;
}



这个是我DLL的导出函数...
imillo19881010 2011-02-10
  • 打赏
  • 举报
回复
我在线程函数加断点, 跑到某一条就自己返回了
imillo19881010 2011-02-10
  • 打赏
  • 举报
回复
DLL的路径是对的...我建立三条线程,但是只有一条或者两条或者三条打印出结果...把某条跑丢了
阿茶你在哪里 2011-02-10
  • 打赏
  • 举报
回复
hThread == INVALID_HANDLE_VALUE
这句是有问题,但不至于抛异常,应为hThread是有效值,是一个数组的首地址,不太可能等于INVALID_HANDLE_VALUE
hhh_hao 2011-02-10
  • 打赏
  • 举报
回复
if (hThread == INVALID_HANDLE_VALUE)
{
printf("CreateThread is failed,GLE=%d",GetLastError());
}
应该是if (hThread[i] == INVALID_HANDLE_VALUE)
阿茶你在哪里 2011-02-10
  • 打赏
  • 举报
回复

hDllInst = LoadLibrary("E:\\sourcesafe\\PrintLogDll\\Debug\\PrintLogDll.dll");和
PrinLogDll = (PrinLog)GetProcAddress(hDllInst, "PrinLogDll");和
hThread[i] = CreateThread( NULL, 0, Thread, NULL,0, NULL);处加断点,查看hDllInst,PrintLogDll,hThread[i]句柄的值是否为空。
如果都没有,那么应该没有问题。个人觉得dll句柄没有获取到,查看一下E:\\sourcesafe\\PrintLogDll\\Debug\\PrintLogDll.dll对应位置有没有文件
chzhn 2011-02-10
  • 打赏
  • 举报
回复
在线程函数入口处加个EnterCriticalSection,末尾处加个LeaveCriticalSection试试。

33,319

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧