VC编程:
int CTryAgainView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
m_listView.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER|LVS_EDITLABELS,
CRect(0,0,900,2000),this,IDC_LISTVIEW);            ....
            ....//创建ClistCtrl
return 0;
}
void CTryAgainView::FillList(int n, int j, CString str)
{
   .......//填写ClistCtrl}
//启动线程
void CTryAgainView::OnTest() 
{
for(int i=0;i<10;i++)
{ cs.Lock();
str.Format("#%d---->Just test",i);
k=i;
j=i;
cs.Unlock();
thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
}
//线程
UINT WriteList(LPVOID param)
{
int m,n;
CString str1;
CTryAgainView* pView=(CTryAgainView*) param;
 
pView->cs.Lock();
str1=((CTryAgainView*) param)->str;
m=((CTryAgainView*) param)->j;
n=((CTryAgainView*) param)->k;
pView->cs.Unlock();
((CTryAgainView*) param)->FillList(m,n,str1); return 0;
}
结果:我想达到每隔1秒显示一条数据的效果,但事实上他等时间耗尽,一起显示了出来结果.
提问:如何实现这个效果,最好能具体一点,谢谢了.

解决方案 »

  1.   

    修正:OnTest() 里的循环少放了一个Sleep(1000).
    void CTryAgainView::OnTest() 
    {
            Sleep(1000);
    for(int i=0;i<10;i++)
    { cs.Lock();
    str.Format("#%d---->Just test",i);
    k=i;
    j=i;
    cs.Unlock();
    thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
    }
      

  2.   

    你开了十条线程?你的思路好象有点问题。哪里有实现1秒的定时?cs是临界区吧.
    //启动线程
    void CTryAgainView::OnTest() 
    {
        thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL);
    }
    //线程
    UINT WriteList(LPVOID param)
    {
    int m,n;
    CString str1;
    CTryAgainView* pView=(CTryAgainView*) param; for(int i=0;i<10;i++)
    {
    str.Format("#%d---->Just test",i);
    pView->FillList(i,i,str);
    Sleep(1000);
    }
    return 0;
    }
      

  3.   

    AA3000:
    我拷贝进来的时候忘了复制Sleep了,已补充.
    另外数据是我是做在在OnTest()里获得,
    我是举例模拟一个读卡的数据获得,有一定的时间延迟,如果都写上来太长了.
      

  4.   

    另外
    CCriticalSection cs; // cs 是临界区
    这个好象不用刷新就能正常.
      

  5.   

    书名就叫《Windows内核编程》吗?好像讲的都是些很高深东西,希望我能看懂。实现这个问题是不是很困难?仍然期待答案中...
      

  6.   

    楼上的,还是不大明白,是因为我设置的线程优先级太高阻塞了进程的消息循环吗?我在线程中又等待什么呢?楼上的是要我在线程中用waitforsingleobject()吗?
      

  7.   

    不是的,以你的例子来说,void CTryAgainView::OnTest() 
    {
             //Sleep(1000);
    for(int i=0;i<10;i++)
    {
                      Sleep(1000);//我猜是在这里
    cs.Lock();
    str.Format("#%d---->Just test",i);
    k=i;
    j=i;
    cs.Unlock();
    thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
    }在这个for循环结束之前(大概10秒钟),OnTest()一直没有返回,主线程处于阻塞状态。
    你可以用aa3000(杀手K)的方法试试,应该可以的
      

  8.   

    晕,你说的对极了,那个Sleep就是在那里,我匆匆的补上来,没考虑周到。
    事实上我要做的事情是读取一张卡里64个块的数据,每读一个块,需要有一个相应的显示。
    读卡大致就是一个循环验证、取数据的过程,会有一点延时,所以再循环里要加个sleep模拟一下,哈哈,结果我放错地方了。
    我想读取的过程在Ontest()里完成。
    如果按照aa3000的方法,我应该换个思路了,在线程里完成取数据还加上显示?这样就根本用不上线程了。
    我写过不用线程的方法,结果是等我64个块的数据读完,等待了5-6秒吧,唰的全显示了,也是达不到这个效果。
      

  9.   

    我觉得应该开10个线程,每个线程各干各的事情,sleep放在writelist中表示各自的延时
      

  10.   

    哈哈,thinmonkey,加油,帮我想办法啊。
    就这例子而言,开10个线程可以考虑,但在writelist里放延时,那test里呢,还放延时吗?
    如果不放,就和事实的要求的本意不合了。
      

  11.   

    iamshuke() 兄:
    还有一个问题,如果我把优先级设成Normal,第一次的数据str好像就丢失了,
    在显示里,str为空数据,这也很奇怪,搞不明白,请指点一下其中的原因。
      

  12.   

    thinmonkey,试试吧,上聊天室真的很恐怖。
    你说开10个线程会不会出现先写第10个数据再写第9个数据的情况啊
      

  13.   

    UINT WriteList(LPVOID param)
    {
    int m,n;
    CString str1;
    CTryAgainView* pView=(CTryAgainView*) param;
    for(int i=0;i<10;i++){

    pView->str="just test";
    pView->k=i;
    pView->j=i;
    str1=((CTryAgainView*) param)->str;
    m=((CTryAgainView*) param)->j;
    n=((CTryAgainView*) param)->k;
    Sleep(1000);
    ((CTryAgainView*) param)->FillList(m,n,str1);
    }
    return 0;
    }
    void CTryAgainView::OnTest() 
    {
    thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_NORMAL,NULL,NULL,NULL);
    }
    aa3000的回答没有错阿,测试的结果正确
      

  14.   

    thinmonkey....
    结果是正确的,并不代表符合题意啊
      

  15.   

    thinmonkey
    也许是我表达的有问题,我没分了,在非技术区开了一个新贴,去那里看看。
      

  16.   

    重新整理一下,求解中啊!
    我要做的事情是读取一张卡里64个块的数据,每读一个块,需要有一个相应的显示。
    我用Ontest()获取数据,用线程显示数据。
    读卡大致就是一个循环验证、取数据的过程,会有一点延时,所以再循环里要加个sleep模拟一下
    MFC编程:
    int CTryAgainView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CScrollView::OnCreate(lpCreateStruct) == -1)
    return -1;
    m_listView.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER|LVS_EDITLABELS,
    CRect(0,0,900,2000),this,IDC_LISTVIEW);            ....
                ....//创建ClistCtrl
    return 0;
    }
    void CTryAgainView::FillList(int n, int j, CString str)
    {
       .......//填写ClistCtrl}
    //启动线程
    void CTryAgainView::OnTest() 
    {
    for(int i=0;i<10;i++)
    {
                      Sleep(1000);
    cs.Lock();
    str.Format("#%d---->Just test",i);
    k=i;
    j=i;
    cs.Unlock();
    thd=AfxBeginThread(WriteList,this,THREAD_PRIORITY_TIME_CRITICAL,NULL,NULL,NULL); }
    }
    //线程
    UINT WriteList(LPVOID param)
    {
    int m,n;
    CString str1;
    CTryAgainView* pView=(CTryAgainView*) param;
     
    pView->cs.Lock();
    str1=((CTryAgainView*) param)->str;
    m=((CTryAgainView*) param)->j;
    n=((CTryAgainView*) param)->k;
    pView->cs.Unlock();
    ((CTryAgainView*) param)->FillList(m,n,str1); return 0;
    }
    结果:我想达到每隔1秒显示一条数据的效果,但事实上他等时间耗尽,一起显示了出来结果.
    提问:如何实现这个效果,最好能具体一点,谢谢了.
    ///或者不使用线程void CTryAgainView::OnTest() 
    {
    // TODO: Add your command handler code here

    for(int i=0;i<10;i++)
    {
    Sleep(1000);
    str.Format("#%d---->Just test",i);
    k=i;
    j=i;
    FillList(k,j,str); }
    }
    这样的结果和原来一样
      

  17.   

    如果按照aa3000的做法,把sleep放到过程放到线程里,然后猜测主程该耗费的时间,或许用定时器也能办到。