我在写一个server-client 交换文件的应用,要在用户程序中从Socket 读取文件.
读的时候,显示一个新窗口中,用里面的进度条显示进度。可是这个窗口却不能
“及时”显示出来,有的时候等全读完了才显示,即使显示的时候,Cancel按钮也不
响应。而我每从Socket读一次, 32KB, 都要检查一下有没有消息,实现代马如下:// CProgressWnd has a CProgressCtrl object as a member
void CProgressWnd::OnCancel() 
{
    PostMessage(WM_QUIT);
}BOOL CProgressWnd::PeekAndPump()
{
MSG msg;
    while (!cancelled && ::PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) {
        if (!AfxGetApp ()->PumpMessage ()) {
            PostMessage(WM_QUIT);
            return FALSE;
        }
    } return TRUE;
}
// this is the  function receiving a file
void CClntSocket::ReceiveFile(....)
{
   ...
   CProgressWnd pw;
   pw.ShowWindow(SW_SHOW);   While (dataRemaining)
  {
     bytesRead = read (socket, arr, 0x8000, 0);
     dataRemaining -= bytesRead;
     file.Write(...);
     if( !pw.PeekAndPump())
        break;
  }
  ...
}这个程序是在PocketPC 2002 或 WinCE3.0上运行的,用eMbedded VC++3.0编译.
哥哥们救救我啊!

解决方案 »

  1.   

    不好意思,
    while (!cancelled && ::PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) 
    应为
    while (::PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) 或是
    void CProgressWnd::OnCancel() 
    {
        PostMessage(WM_QUIT);
    } 改为
    void CProgressWnd::OnCancel() 
    {
        cancelled = TRUE;
        PostMessage(WM_QUIT);
    }都试过, 都不行
      

  2.   

    都在while里。。太快了。。怎么能反应过来?
      

  3.   

    另外, 实际上while 的条件恒为TRUE, 所以有的时候根本不能显示就死循环
    了。有的时候可以显示进度条, cancel按钮也不知道哪去了
      

  4.   

    应该是有数据来了,系统会通知的呀,你只要在ONRECEIVE中RECEIVE就行了.winsock是消息驱动的.如果你不是用MFC,那你要把SOCKET的消息关联到一个窗口.你可以看看,MSDN 中关于函数 WSAAsyncSelect.
      

  5.   

    我的 ReceiveFile() 就是在 OnReceive() 中调用的,目的就是读
    一个文件一直到完,除非  cancel 按钮被点击。我不明白既然
    OnReceive() 没返回,应该不会有新的 FD_READ message 啊,
    为什么  ::PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE) 恒为
    TRUE?