Newsgroup: it.comp.programmare.win32
Titolo: BCB e mutex

Non riesco proprio a capire cosa non vada in questo codice:
Ho una form con:
1 memo
2 timers
1 TrackBar
Il mutex non ne vuole sapere di funzionare :'(
Mieru
//----------------------      File: Unit1.cpp   ------------------------//
#include <vcl.h>
#include <Windows.h>
#pragma hdrstop
#include "Unit1.h"
#define MUX "MUX"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  cnt=0;
  Timer1->Interval=2000;
  Timer2->Interval=3000;
  TrackBar1->Max=10000;
  busy1=false;
  busy2=false;
  m=CreateMutex(NULL,false,MUX);
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  DWORD dwWaitResult;
  int a;
  dwWaitResult = WaitForSingleObject(m,15000L);
  OpenMutex(MUTEX_ALL_ACCESS,false,MUX);
  if(dwWaitResult==WAIT_OBJECT_0) {
    __try {
      busy1=true;
      a=++cnt;
      Memo1->Lines->Add("-> "+IntToStr(a));
      if(busy2) Memo1->Lines->Add("("+IntToStr(a)+") busy??");
      Memo1->Lines->Add("   "+IntToStr(a)+"  start");
      for(int cnt=0;cnt<10000;cnt++) dosomething(cnt);
      Memo1->Lines->Add("   "+IntToStr(a)+"  end");
      }
    __finally {
      busy1=false;
      ReleaseMutex(m);
      }
   }
}
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
  DWORD dwWaitResult;
  int a;
  dwWaitResult = WaitForSingleObject(m,15000L);
  OpenMutex(MUTEX_ALL_ACCESS,false,MUX);
  if(dwWaitResult==WAIT_OBJECT_0) {
    __try {
      busy2=true;
      a=++cnt;
      Memo1->Lines->Add("-> "+IntToStr(a));
      if(busy1) Memo1->Lines->Add("("+IntToStr(a)+") busy??");
      Memo1->Lines->Add("   "+IntToStr(a)+"  START");
      for(int cnt=10000;cnt>0;cnt--) dosomething(cnt);
      Memo1->Lines->Add("   "+IntToStr(a)+"  END");
      }
    __finally {
      busy2=false;
      ReleaseMutex(m);
      }
   }
}
void TForm1::dosomething(int i)
{
    TrackBar1->Position=i;
    Application->ProcessMessages();
}
//----------------------      File: Unit1.cpp   ------------------------//
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TMemo *Memo1;
        TTimer *Timer1;
        TTimer *Timer2;
        TTrackBar *TrackBar1;
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall Timer2Timer(TObject *Sender);
private:	// User declarations
        void dosomething(int i);
        int cnt;
        bool busy1;
        bool busy2;
        HANDLE m;
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
extern PACKAGE TForm1 *Form1;
#endif

Dopo un'intera giornata di smadonnamenti sono arrivato alla conclusione che 
Application->ProcessMessages() sega le gambe al mutex.
Come mai?? ma e' giusto questo comportamento?
Mieru

 mutex. Come mai?? ma e' giusto questo comportamento?
o processi i messaggi o fai altro. Nel thread che processa i messaggi č 
meglio non fare niente che metta il thread in attesa o che gli richieda 
di rispondere rapidamente a eventi che non siano messaggi
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.3. C, C++ and ASM developers
                               and beta testers are welcome!