代碼如下
DWORD WINAPI
GetFileNameThread(PVOID lpParameter)
{
PNM_INFO NmInfo = lpParameter;
IO_STATUS_BLOCK IoStatus;
NtQueryInformationFile(NmInfo->hFile, &IoStatus, &NmInfo->Info,
sizeof(NM_INFO) - sizeof(HANDLE), FileNameInformation);
return 0;
}
EXTERN_C void GetFileName(HANDLE hFile, PCHAR TheName)
{
HANDLE hThread;
PNM_INFO Info = HeapAlloc(hHeap, 0, sizeof(NM_INFO));
Info->hFile = hFile;
hThread = CreateThread(NULL, 0, GetFileNameThread, Info, 0, NULL);
if (MsgWaitForMultipleObjects(1, &hThread,
FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0) //問題出在這里
{
TerminateThread(hThread, 0);
}
CloseHandle(hThread);
memset(TheName, 0, MAX_PATH);
WideCharToMultiByte(CP_ACP, 0, Info->Info.FileName, Info->Info.FileNameLength >> 1, TheName, MAX_PATH, NULL, NULL);
HeapFree(hHeap, 0, Info);
}
這個程序和執行緒創建,前100個執行緒都沒問題,但之后在waitforsingleobject時子執行緒就崩潰了,主執行緒死鎖了。求解答!
uj5u.com熱心網友回復:
《Windows核心編程》uj5u.com熱心網友回復:
什么意思,這本書上有嗎?uj5u.com熱心網友回復:
執行緒 'Win32 執行緒' (0x9b4) 已退出,回傳值為 -1073741510 (0xc000013a)。執行緒 'Win32 執行緒' (0x2640) 已退出,回傳值為 -1073741510 (0xc000013a)。
執行緒 'Win32 執行緒' (0x2088) 已退出,回傳值為 -1073741510 (0xc000013a)。
程式“[9648] cheumn.exe: 本機”已退出,回傳值為 -1073741510 (0xc000013a)。
死鎖后是這樣的
uj5u.com熱心網友回復:
每次都是開到第117個執行緒時出的問題uj5u.com熱心網友回復:
0xc000013a 創建執行緒失敗 ?uj5u.com熱心網友回復:
啊,這是死鎖還是創建失敗啊,如果創建失敗為什么主執行緒還要退出?而且我通過除錯發現似乎誘導此現象出現的原因是同一個檔案句柄uj5u.com熱心網友回復:

就是這樣卡住了
uj5u.com熱心網友回復:
“同一個檔案句柄”log 這個 檔案 !
uj5u.com熱心網友回復:
變數初始化, 檢測每一步的回傳值,
DWORD WINAPI GetFileNameThread(PVOID lpParameter)
{
PNM_INFO NmInfo = (PNM_INFO)lpParameter;
if(NmInfo)
{
IO_STATUS_BLOCK IoStatus = {0};
NtQueryInformationFile(NmInfo->hFile, &IoStatus, &NmInfo->Info,
sizeof(NM_INFO) - sizeof(HANDLE), FileNameInformation);
}
return 0;
}
EXTERN_C void GetFileName(HANDLE hFile, PCHAR TheName)
{
if(TheName)
{
memset(TheName, 0, MAX_PATH);
}
HANDLE hThread = NULL;
PNM_INFO Info = (PNM_INFO)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(NM_INFO));
DWORD dwErr = 0;
if(Info != NULL)
{
Info->hFile = hFile;
hThread = CreateThread(NULL, 0, GetFileNameThread, Info, 0, NULL);
if(hThread)
{
DWORD dwWait = WaitForSingleObject(hThread, INFINITE);
if(dwWait == WAIT_OBJECT_0)
{
WideCharToMultiByte(CP_ACP, 0, Info->Info.FileName, Info->Info.FileNameLength >> 1,
TheName, MAX_PATH, NULL, NULL);
OutputDebugStringA(TheName);
OutputDebugStringA("\r\n");
}
else
{
dwErr = GetLastError();
TRACE(_T("WaitForSingleObject failed %u\n"), dwErr);
}
CloseHandle(hThread);
}
else
{
dwErr = GetLastError();
TRACE(_T("CreateThread failed %u\n"), dwErr);
}
HeapFree(hHeap, 0, Info);
}
else
{
dwErr = GetLastError();
TRACE(_T("HeapAlloc failed %u\n"), dwErr);
}
}
uj5u.com熱心網友回復:
具體怎么做,我是小白,大神求解uj5u.com熱心網友回復:
還有一個疑點是:同一個句柄,這個句柄作業在named pipe內,我創建執行緒就是為了獲取pipe訊息,這個程式所屬的name piped是這樣的:
但是前面這種named pipe:

這種就可以,唯獨剛剛那個named pipe不行,還會導致執行緒退出,這是為什么啊?
uj5u.com熱心網友回復:
使用執行緒池。uj5u.com熱心網友回復:
還沒解決啊啊啊啊啊啊uj5u.com熱心網友回復:
命名管道是阻塞等待狀態所以你的代碼列舉到命名管道的句柄就會死鎖掉了。和執行緒不執行緒沒啥關系。GetFileInformationByHandleEx不能用么?要自己寫?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/63985.html
標籤:進程/線程/DLL
上一篇:視窗風格的后四位表示什么?
