关于线程函数与调用界面OCX控件,救命呀!解决方法
关于线程函数与调用界面OCX控件,救命呀!!!
DWORD WINAPI CNView::ThreadProc( LPVOID lParam ) //线程函数
{
CNView* obj = (CNView*)lParam; //参数转化
obj->hDir = CreateFile( //打开目录,得到目录的句柄
obj->m_strWatchedDir,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);
if(obj->hDir ==INVALID_HANDLE_VALUE )
return false;
char buf[(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH)*2];
FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION*)buf;
DWORD dwBytesReturned;
while(true)
{
if( ::ReadDirectoryChangesW( obj->hDir,
pNotify,
sizeof(buf),
true,
FILE_NOTIFY_CHANGE_FILE_NAME|
FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_LAST_WRITE|
FILE_NOTIFY_CHANGE_LAST_ACCESS|
FILE_NOTIFY_CHANGE_CREATION|
FILE_NOTIFY_CHANGE_SECURITY,
&dwBytesReturned,
NULL,
NULL ) )
{
char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH];
memset( tmp, 0, sizeof(tmp) ); //ZeroMemory()
WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str1, tmp );
if(pNotify->NextEntryOffset !=0 )
{
PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
memset( tmp, 0, sizeof(tmp) );
WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str2, tmp );
}
switch(pNotify->Action)
{
case FILE_ACTION_ADDED:
if(obj->m_bAddNew0)
{
AfxMessageBox(str1);
AfxMessageBox("NEW了文件");
CString strTT;
strTT= _T("F:\\LAB\\1008290937b45e53da3d275009.jpg");
m_recN.RecognisePicFile(strTT);//
}
break;
------解决方案--------------------
线程里不要调用MFC的类。非线程安全的。用消息来中转。
------解决方案--------------------
m_recN.RecognisePicFile(strTT);
m_recN所属窗体的控件吧??
SendMessage(主窗体句柄,自定义消息好,strTT指针,NULL);
让主界面线程来处理。
DWORD WINAPI CNView::ThreadProc( LPVOID lParam ) //线程函数
{
CNView* obj = (CNView*)lParam; //参数转化
obj->hDir = CreateFile( //打开目录,得到目录的句柄
obj->m_strWatchedDir,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);
if(obj->hDir ==INVALID_HANDLE_VALUE )
return false;
char buf[(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH)*2];
FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION*)buf;
DWORD dwBytesReturned;
while(true)
{
if( ::ReadDirectoryChangesW( obj->hDir,
pNotify,
sizeof(buf),
true,
FILE_NOTIFY_CHANGE_FILE_NAME|
FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_LAST_WRITE|
FILE_NOTIFY_CHANGE_LAST_ACCESS|
FILE_NOTIFY_CHANGE_CREATION|
FILE_NOTIFY_CHANGE_SECURITY,
&dwBytesReturned,
NULL,
NULL ) )
{
char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH];
memset( tmp, 0, sizeof(tmp) ); //ZeroMemory()
WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str1, tmp );
if(pNotify->NextEntryOffset !=0 )
{
PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
memset( tmp, 0, sizeof(tmp) );
WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str2, tmp );
}
switch(pNotify->Action)
{
case FILE_ACTION_ADDED:
if(obj->m_bAddNew0)
{
AfxMessageBox(str1);
AfxMessageBox("NEW了文件");
CString strTT;
strTT= _T("F:\\LAB\\1008290937b45e53da3d275009.jpg");
m_recN.RecognisePicFile(strTT);//
}
break;
------解决方案--------------------
线程里不要调用MFC的类。非线程安全的。用消息来中转。
------解决方案--------------------
m_recN.RecognisePicFile(strTT);
m_recN所属窗体的控件吧??
SendMessage(主窗体句柄,自定义消息好,strTT指针,NULL);
让主界面线程来处理。