A
Das Problem mit der Synchronisation hatte ich auch, da ich mit der gleichen Klasse mehrere Schnittstellen, teilweise dieselbe, abfrage.
Das habe ich dann durch Semaphoren verriegelt. Dies hat aber nichts mit dem BCC zu tun sondern Winapi.
Habe Dir das auch mal kopiert:
char* SemaText = new char[Port+10];
// Semaphorenname zusammenbasteln der eindeutig ist
// Falls ein anderes Objekt erzeugt wurde, was auf denselben Port zugreift
// kann hiermit sichergestellt werden, daß nicht beide gleichzeitig senden
sprintf(SemaText,"%s%d","Com",Port);
hSemaphore = CreateSemaphore(
NULL, // no security attributes
1, // initial count
1, // maximum count
SemaText); // unnamed semaphore
if(GetLastError()==ERROR_ALREADY_EXISTS)
ShowMessage("Fehler bei Erstellung der Semaphore\nexistiert schon");
if (hSemaphore == NULL)
{
// Check for error.
// ~TScaleHandler();
}
// ....weiterer hierfür nicht wichtiger Code
// Semaphorenanforderung
bool TScaleHandler::RequestSema()
{
int i = 0;
// insgesamt wird 10 Sekunden auf die Freigabe der Semaphore gewartet
// mögliche Rückmeldungen von WaitForSingleObject:
// WAIT_OBJECT_0 ==> Semaphore freigegeben
// WAIT_TIMEOUT ==> Semaphore belegt
// mit Infinite würde das aufrufende Programm niemals wieder erreicht werden
do {
// wir warten 0,1 sec (100ms) für unendlich -> INFINITE
dwWaitResult = WaitForSingleObject(hSemaphore, 100L);
++i;
}
while( (dwWaitResult != WAIT_OBJECT_0) && (i < 100));
if(dwWaitResult == WAIT_OBJECT_0)
// Semaphore signaled.
return true;
else
iLastError = SE_REQSEMA;
return false;
}
// Semaphorenfreigabe
bool TScaleHandler::ReleaseSema()
{
if (!ReleaseSemaphore(hSemaphore,1, NULL) )
{
iLastError = SE_RELSEMA;
return false;
}
else
return true;
}
// Beispiel, wie und wo Semaphorenverriegelung benutzt wurde
bool TScaleHandler::Auto_Tare()
{
if(!RequestSema())
return false;
// hier steht der Code, der nicht "gestört" werden darf
if(!ReleaseSema())
return false;
}