线程操作:CreateThread

来源:互联网 发布:js图片触摸缩放 编辑:程序博客网 时间:2024/06/03 21:07
在上次写的遍历全盘指定文件的程序中存在着一个问题:程序运行的时候,界面就锁定了,不能移动,不能最小化,就好像卡死了一样。现在讲遍历函数放在一个线程中执行,就不会出现这种情况:这里有两个难点
1.一般线程都是进行一些如界面无关的复杂计算,这里需要将遍历结果显示在Memo中,就涉及到如何在线程中对窗体上控件的操作
==========================================================
   DWORD WINAPI ThreadProc(LPVOID LpParamter)    //注意 线程过程的定义方式
{
    TForm1* b;
    b= (TForm1*)LpParamter;
   //EnterCriticalSection();
    b->MyEnumFiles("F:\\","*.*");
   //LeaveCriticalSection();
    return 0;
     }
=========================================================
     DWORD  id;     //按钮事件中的执行代码
     HANDLE hwnd=CreateThread(NULL,0,ThreadProc,(void*)this,NULL,&id);
    CloseHandle(hwnd);
========================================================
     这里采用的办法是将窗体Form1这个类的指针作为参数传递给线程过程。(这里的思想跟sendmessage发送消息的参数很相似),如果有多线程的话要注意线程同步。
     同时这里将MyEnumFiles()函数放到TForm1类中,作为其中的一个成员函数。这样就避免了在线程过程中调用子函数,造成的同步问题。

2.因为线程过程的格式是固定的,只能向其中传递一个参数,当线程过程需要用到多个参数时候怎么办?
     可以用一个结构体struct 来记录所需参数,然后将该结构体的指针作为线程过程的参数,如:
     struct A{
          int        arg1;
          void*    arg2;
          double  arg3  }
    A   argv;

CreateThread(NULL,0,ThreadProc,(void*)&argv,NULL,&id); //将指针传递给线程过程
然后在线程过程中将线程参数再还原为A这样的结构体即可:
   DWORD WINAPI ThreadProc(LPVOID LpParamter)   
{
    A*  b;
    b= (A*)LpParamter;//便可以从b这个结构体中取出参数;
    .....
    ......
    return 0;
     }
0 0
原创粉丝点击