我在写一个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编译.
哥哥们救救我啊!
读的时候,显示一个新窗口中,用里面的进度条显示进度。可是这个窗口却不能
“及时”显示出来,有的时候等全读完了才显示,即使显示的时候,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编译.
哥哥们救救我啊!
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);
}都试过, 都不行
了。有的时候可以显示进度条, cancel按钮也不知道哪去了
一个文件一直到完,除非 cancel 按钮被点击。我不明白既然
OnReceive() 没返回,应该不会有新的 FD_READ message 啊,
为什么 ::PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE) 恒为
TRUE?