以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  请问一个启动线程的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=31225)


--  作者:qianqiuxue
--  发布时间:4/25/2006 12:54:00 PM

--  请问一个启动线程的问题
我用VC编写的串口烧写程序,烧写时点击它没有响应。
于是我就用AfxBeginThread又启动了一个线程,想把烧写过程转到后台,在烧写时还可以点其它按钮
可是改了以后点击其它按钮还是没响应,请问是什么原因啊
还有其它办法吗?
--  作者:卷积内核
--  发布时间:4/26/2006 11:31:00 AM

--  
线程中while判断中加上 Sleep(100); 就好了,试试看.
--  作者:qianqiuxue
--  发布时间:4/26/2006 2:11:00 PM

--  
谢谢了啊,可是烧写没有用循环,直接通过
BOOL fState=WriteFile(h_com,sz,szLength,&nLength,&m_osWrite;
来实现的
就是选择好所有要烧写的文件,点击“烧写”按钮,就调用一个发送数据的函数onsdcommand
我在这个函数里用Afxbeginthread启动一个线程,下面是线程的代码
UINT CComDlg::CommWriteProc(LPVOID pparam)
{
 COMSTAT ComStat;
 ULONG nLength=0;
 //CString m_send1;
 
 //m_send1=m_send;
   // UpdateData(true);
 ULONG szLength = m_send.GetLength();
 
 char *sz = new char[szLength];
 if(sz==NULL)
  return 0;
 memcpy(sz,m_send.GetBuffer(szLength),szLength);
 DWORD dwErrorFlags;
 
 ClearCommError(h_com,&dwErrorFlags,&ComStat);//清除串口错误*/
    BOOL fState=WriteFile(h_com,sz,szLength,&nLength,&m_osWrite);//数据发送

 if(!fState)
 {
  ULONG my_error=GetLastError();
  if(my_error==ERROR_IO_PENDING)//重叠I/O操作未完成
  {
   GetOverlappedResult(h_com,&m_osWrite,&nLength,TRUE);//调用GetOverlappedResult函数等待,如果指定该函数的bWait参数为TRUE,那么该函数将等待OVERLAPPED结构的hEvent
  }
  else
   nLength=0;
 }
 
    delete[] sz;
 sz=NULL;
 return 0;
 }


--  作者:卷积内核
--  发布时间:4/27/2006 9:03:00 AM

--  
那这里必须要线程吗?一般线程是用来实时循环检测某一状态或者并行来使用.
--  作者:qianqiuxue
--  发布时间:4/28/2006 8:49:00 AM

--  
是啊,就是希望调用烧写函数时,它能再启动一个线程专门完成烧写,这样就可以把烧写转到后台,主线程就可以做其它事情,程序就不会死在那里了
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms