我想做一个这样的东西。
一个程序是多线程的,接收很多的信息,当接受到一个信息的时候我设置一个互斥量,防止别人使用资源,当我处理完成以后,我是否这个互斥量,让以前的信息继续处理。
我是这样写的!!
//定义
MYRecord=record
    .....    
    tMutex:hwnd;                         {定义一个互斥量}
//初始化
...
MYRecord.tMutex:=0;
//创建一个互斥量
MYRecord.tMutex:=CreateMutex(nil,False,'Mutex');
//等待
WaitForSingleObject(MYRecord.tMutex,5000);//解除互斥
ReleaseMutex(MYRecord.tMutex);现在的问题是,当我等待的时候,根本就不能等待,是直接执行的。(5000根本就不起作用)。这是为什么呢??

解决方案 »

  1.   

    1. CreateMutex是否执行成功
    2. 其实你的问题是这样的....你这个MYRecord.tMutex 有谁还用到么??没人用到自然就是它自己的了
      

  2.   

    'Mutex'换一个特殊的试试,这个名字也许被人占了
      

  3.   

    一般应该是这样的
    主线程 CreateMutext....
    其他线程WaitForSingleObject ... OpenMutext......RealseMetext...
      

  4.   

    hMutex: THANDLE;
    function ReadThread(lpPointer: Pointer):DWORD;
    var
      dwWait: DWORD;
    begin
      Result := 0;
      dwWait := WaitForSingleObject(hMutex, INFINITE);
      if dwWait = WAIT_OBJECT_0 then
      begin
        ShowMessage(Form1.Edit1.Text);
        ReleaseMutex(hMutex);
      end;
    end;function WriteThread(lpPointer: Pointer):DWORD;
    begin
      Result := 0;
      WaitForSingleObject(hMutex, INFINITE);
      Form1.Edit1.Text := 'write';
      Sleep(1000); // the reason for Sleep is:
                   // WM_PAINT 优先级最低 
                   // 你可以屏蔽此句试试
      ReleaseMutex(hMutex);
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      dwWrite,dwRead:DWORD;
    begin
      hMutex := CreateMutex(nil, False, 'No1');
      CreateThread(nil, 0, @WriteThread, nil, 0, dwWrite);
      CreateThread(nil, 0, @ReadThread, nil, 0, dwWrite);
    end;