界面线程和工作线程 书上说,在工作线程里不要做跟界面有关的东西,但我老师不明白,怎么样的行为称得上是和界面有关假如,一个工作线程用于进行数据传输,那么如果需要传输的数据时需要从控件中读取,那么这个从控件读取数据的动作,算不算是和界面有关? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 所谓在工作线程里不要做跟界面有关的东西,好像是说不要在工作线程里更新界面,如Enable...、Set...之类 UINT ThreadStart(LPVOID p){ CButton *thisdlg = (CButton*)p; thisdlg->SetWindowText(_T("aaaaaaa")); return 0;}void CtestDlg::OnBnClickedButton1(){ AfxBeginThread(ThreadStart,(void*)&m_btn2);}还有,这段代码执行的时候为什么没有出现卡死的情况呢 读取你肯定想读取到当前最新的吧,你如果用控件关联变量,是不是要UpdateData下,更新的过程中就是对界面数据的一次读操作 但问题是,为什么有的操作,如在线程中更新进度条,就可以正常工作。例如下面的代码UINT CSendFileDlg::SendFileThread( LPVOID lparam ){ CSendFileDlg *pthisDlg = (CSendFileDlg*)lparam; FILEINFO FileInfo; // A int loopcounter = pthisDlg->m_SendFile_List.GetItemCount(); SOCKET SocketRecv = pthisDlg->m_SendSocket; CFile tmp_ReadFile; for (int i = 0 ; i < loopcounter ; i++) //B { wcscpy_s(FileInfo.FileName ,pthisDlg->m_SendFile_List.GetItemText(i , 1)); tmp_ReadFile.Open(pthisDlg->m_SendFile_List.GetItemText(i , 3) , CFile::modeRead|CFile::shareDenyNone); FileInfo.FileSize = tmp_ReadFile.GetLength(); FileInfo.RestFileCount = loopcounter-i-1; send(SocketRecv ,(char*)&FileInfo , sizeof(FileInfo),0); tmp_ReadFile.Close(); } // 从listctrl中读取文件路径,并发送文件 // ......}当有B处的循环代码时,直接在loopcounter = pthisDlg->m_SendFile_List.GetItemCount();处卡死而没有B处时则一切正常,即便之后又从listCtrl中读取数据、更新进度条也都能正常进行这是何故, 你b处是干什么用的?不是从list中读取文件路径,并发送文件的?? 就是从list中读取文件路径,然后读取文件并发送 看不懂你9楼的问题...而没有B处时则一切正常,即便之后又从listCtrl中读取数据、更新进度条也都能正常进行..你b处就是从list中读取文件路径,然后读取文件并发送,你又说而没有B处时则一切正常..即便之后又从listCtrl中读取数据、更新进度条也都能正常进行.. 哦,抱歉,说错了,B处的代码只是发送文件的信息(文件名和大小),并等待接收方的回应。而B处之后的代码才是发送文件,即从list中读取文件路径..... 将一帧图像数据缩小或放大显示 求助:如何使得CStatic控件在对话框中最顶层显示? 为什么不能访问公有变量? MultiByteToWideChar LdapUnicodeToUTF8 问题 一个很简单很简单的问题 任命wuxuan、bcpl、jiangsheng为大版主 24色向256色灰度转化,图像出现倾斜,什么原因? 帮帮我吧 用 win api 编写 ftp 程序的问题 数据库问题,急!up有分,不够再加! HTMLCtrl 程序中怎么获取网页元素的数据? 各位大哥,进来给看看这个控件问题,谢谢拉
Set...之类
UINT ThreadStart(LPVOID p)
{
CButton *thisdlg = (CButton*)p;
thisdlg->SetWindowText(_T("aaaaaaa"));
return 0;
}
void CtestDlg::OnBnClickedButton1()
{
AfxBeginThread(ThreadStart,(void*)&m_btn2);
}
还有,这段代码执行的时候为什么没有出现卡死的情况呢
读取你肯定想读取到当前最新的吧,你如果用控件关联变量,是不是要UpdateData下,更新的过程中就是对界面数据的一次读操作
{
CSendFileDlg *pthisDlg = (CSendFileDlg*)lparam; FILEINFO FileInfo;
// A
int loopcounter = pthisDlg->m_SendFile_List.GetItemCount();
SOCKET SocketRecv = pthisDlg->m_SendSocket;
CFile tmp_ReadFile;
for (int i = 0 ; i < loopcounter ; i++) //B
{
wcscpy_s(FileInfo.FileName ,pthisDlg->m_SendFile_List.GetItemText(i , 1));
tmp_ReadFile.Open(pthisDlg->m_SendFile_List.GetItemText(i , 3) , CFile::modeRead|CFile::shareDenyNone);
FileInfo.FileSize = tmp_ReadFile.GetLength();
FileInfo.RestFileCount = loopcounter-i-1; send(SocketRecv ,(char*)&FileInfo , sizeof(FileInfo),0);
tmp_ReadFile.Close();
} // 从listctrl中读取文件路径,并发送文件
// ......
}
当有B处的循环代码时,直接在loopcounter = pthisDlg->m_SendFile_List.GetItemCount();处卡死而没有B处时则一切正常,即便之后又从listCtrl中读取数据、更新进度条也都能正常进行
这是何故,
就是从list中读取文件路径,然后读取文件并发送
...而没有B处时则一切正常,即便之后又从listCtrl中读取数据、更新进度条也都能正常进行..你b处就是从list中读取文件路径,然后读取文件并发送,你又说而没有B处时则一切正常..即便之后又从listCtrl中读取数据、更新进度条也都能正常进行..
哦,抱歉,说错了,B处的代码只是发送文件的信息(文件名和大小),并等待接收方的回应。而B处之后的代码才是发送文件,即从list中读取文件路径.....