解决方案 »

  1.   

    然后我在OnTimer函数里用AfxMessageBox()把当前的p,q,r输出来,发现这三个下标永远都是0,24,49(一共50个数),然后程序居然崩溃了,不在OnTimer里显示这三个下标就没事,可以排序成功,难道是SetTimer的用法错了吗?
      

  2.   

    确实用错了,递归函数返回的也是最终结果,难道你期望返回中间结果。
    逻辑也不对
    “每隔300ms排一次序并且重画一次”
    应该是程序初始时
    settime()
    然后在onTimer里
    {
     MergeSort(int a[],int p,int r)
    Invalidate
    }
    最后onDraw
    不过不能确定数组有多大,300ms能否结束排序
    总之排序函数里不要setTime
      

  3.   

    你要演示过程, 那么就需要把计算过程手动变慢, SetTimer后Sleep  1秒钟.  并且你的计算过程需要放到子线程中, 不能阻塞UI线程, 否则看不到效果.
      

  4.   

    我的意思是想把排序的中间过程用动画显示出来,我是想让程序每把两组数合并时就重画一次,如果把MergeSort()这个函数直接放在OnTimer()里,那就直接把排序的最终结果显示出来了,达不到想要的效果额
      

  5.   

    额,我新学的mfc,很多东西都不太懂,能不能帮忙解释下“阻塞UI线程”是什么意思?还有,我看网上说线程分为工作线程和用户界面线程,你说的这个UI线程是属于哪一类?
      

  6.   

    我按照你说的试了下,果然成功了!
    你看我弄得合不合适:
    我在OnDraw()里用AfxBeginThread()函数建立了一个工作线程;
    在线程函数里调用排序算法:
    UINT AfxMergeThread(LPVOID pParam)
    {
    void MergeSort(int a[],int p,int r);
    MergeSort(Numbers,p,r);
    return 1;
    }
    然后把排序算法本身改了下:
    void MergeSort(int a[],int p,int r)
    {
    void Merge(int a[],int p,int q,int r);
    if(p<r)
    {
    int q=(p+r)/2;
    MergeSort(a,p,q);
    MergeSort(a,q+1,r);
    Merge(Numbers,p,q,r);
    CMergeSortView*pMyView=(CMergeSortView*)((CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
    pMyView->Invalidate();
    Sleep(300);
    }
    }
    我没用SetTimer(),我获得了视图指针,然后每次合并完了就调用Invalidate(),然后调用Sleep(300);就成功啦,好开心!
    还有一个问题:为什么我在视图类里的排序函数中调用Sleep()函数程序就会卡死然后关掉呢,而在线程里调用Sleep()却不会发生这种情况?
      

  7.   

    Sleep()会阻塞进程单线程中应用应该没关系,在主线程时阻塞可能会有问题