witam serdecznie.
nie moge sobie poradzic z jedna rzecza.
moj program posiada jeden rownolegly watek. program jak i dodatkowy watek zadaje pytania serwerowi SQL. kiedy program chce zadac pytanie ustawia flage informujaca watek, zeby on nie robil tego samego. tymczasem w watku przed zadaniem pytania wchodze w sekcje krytyczna, co powinno zapobiec przerwaniu watku i przekazaniu sterowania do programu. kiedy watek lub program zadaje pytanie nie moze sie zdazyc, ze przed otrzymaniem odpowiedzi windows przelaczy sie z watku do programu lub odwrotnie i pozwoli na zadanie kolejnego pytania, zanim jeszcze dostanie odpowiedz z serwera. efekt bedzie taki, ze serwer SQL otrzyma dwa pytania po kolei bez mozliwosci odpowiedzenia na pierwsze z nich. wydawaloby sie, ze flaga informujaca watek, zeby nie wykonywal polecen, ktore zawiera w ciele jego funkcji, gdy program wysyla zapytanie i oczekuje na odpowiedz i sekcja krytyczna w samym watku powinny wystarczyc ale wyglada na to ze pomimo sekcji krytycznej windows przelacza sterownie, poniewaz otrzymuje bledy z serwera SQL, dotyczace wysylania dwoch zapytania bez proby odczytania odpowiedzi na pierwsze z nich. dodatkowo w samym programie sprawdzam ustawienie flagi sql.temp, ktora ustawia sam watek na TRUE po wejsciu juz w sekcje krytyczna i ustawia ponownie na FALSE przed wyjsciem z tej samej sekcji. wydaje mi sie, ze program nigdy nie powinien byc w sytuacji, ze odczytuje flage ustawiona przez watek i zastaje w niej wartosc TRUE, poniewaz flaga ta jest ustawioana na TRUE i chwile potem na FALSE wewnatrz sekcji krytycznej.
oto kod watku:
DWORD WINAPI threadProc_KeepConectionAlive(int pParam) //podtrzymywanie polaczenia
{
CRITICAL_SECTION cs1 ;
InitializeCriticalSection ( &cs1 ) ;
char txt[200];
int start,end;
static int count;
int temp;
while (TRUE)
{
//czy program nie wysyla zapytania
while( sql.SQL_QUERY_STATUS == TRUE )
{
Sleep( sql.SQL_QUERY_STATUS_WAIT );
}
EnterCriticalSection ( &cs1 ) ; //wejscie do sekcji krytycznej.
//-----------------------------------------
sql.temp = TRUE;
//Beep(100,100);
start = GetTickCount();
otl_stream i(1,"select ID from LOG_ERROR where ID = 1",db);
i>> temp;
//sql.serverLogOff();
//sql.logon();
end = GetTickCount();
wsprintf(txt,"thread time: %d",end-start);
SetWindowText(hwndMessage[1],txt);
wsprintf(txt,"thread count: %d",count++);
SetWindowText(hwndMessage[2],txt);
//-----------------------------------------
sql.temp = FALSE;
LeaveCriticalSection ( &cs1 ) ;
//wyjscie z sekcji krytycznej.
Sleep( sql.THREAD_DURATION_CONNECTION );
}
DeleteCriticalSection ( &cs1 ) ; //skasowanie sekcji kiedy nie jest juz potrzebna.
return FALSE;
}
nie wiem, czy moze cos zle robie jesli chodzi o sekcje krytyczna, ze nie spelnia swojego zadania czy problem jest gdzie indziej. mecze sie juz nad tym drugi dzien i nie moge dojsc do zrodla problemu. chetnie odpowiem na dodatkowe pytania, jesli to co napisalem nie jest wystarczajace.
pozdrawiam
Mariusz