Приложение 3. Пример многопоточной обработки
#include < stdio.h > #include < stdlib.h > #include < string.h > #ifdef WIN32 #include < process.h > #else #ifdef UNIX # ifdef LINUX # include < pthread/mit/pthread.h > # endif #endif #endif #ifdef __WATCOMC__ #include < dos.h > #endif #ifdef WIN32 void __stdcall th1(void*); void __stdcall th2(void*); void __stdcall th3(void*); #else #ifdef UNIX # ifdef LINUX void* th1(void*); void* th2(void*); void* th3(void*); # endif #endif #endif EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; CONTEXT ctx1, ctx2, ctx3; VARCHAR uid[20], pwd[20]; char name[20]; char city[15]; EXEC SQL END DECLARE SECTION; #ifdef WIN32 unsigned long id1, id2, id3; #else #ifdef UNIX # ifdef LINUX thread_t id1, id2, id3; # endif #endif #endif int ret; int Wth1, Wth2, Wth3; void main() { strcpy(uid.arr,"SYSTEM"); uid.len=strlen(uid.arr); strcpy(pwd.arr,"MANAGER8"); pwd.len=strlen(pwd.arr); EXEC SQL WHENEVER SQLERROR GOTO sqlerr; EXEC SQL ENABLE THREADS; EXEC SQL CONTEXT ALLOCATE :ctx1; EXEC SQL CONTEXT ALLOCATE :ctx2; EXEC SQL CONTEXT ALLOCATE :ctx3; EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; printf ("Thr0 : PCIA_Connect()\n"); Wth1 = Wth2 = Wth3 = 1; #if defined WIN32 _beginthreadex(0, 16384,th1, 0, 0, &id1); _beginthreadex(0, 16384,th2, 0, 0, &id2); _beginthreadex(0, 16384,th3, 0, 0, &id3); #else #if defined UNIX # if defined LINUX pthread_create(&id1,NULL,th1,NULL); pthread_create(&id2,NULL,th2,NULL); pthread_create(&id3,NULL,th3,NULL); # endif #endif #endif EXEC SQL PREPARE ST FROM select name, city from person where Age < =30; printf ("Thr0 : PCIA_Prepare()\n"); EXEC SQL DECLARE CR CURSOR_PCI FOR ST; EXEC SQL OPEN CR; printf ("Thr0 : PCIA_Open()\n"); for(;;) { EXEC SQL WHENEVER NOT FOUND GOTO not_found; EXEC SQL FETCH CR INTO :name, :city; printf ("Thr0 : PCIA_Fetch()\n"); printf("\nThr0 Name is : %s; City is : %s;", name, city); } not_found: EXEC SQL CLOSE CR; EXEC SQL COMMIT RELEASE; printf ("Thr0 : PCIA_CommRoll()\n"); sqlerr: printf ("Thr0 Error: %ld\n",ErrPCI(CtxPCI_)); while (Wth1 || Wth2 || Wth3)sleep(0); EXEC SQL CONTEXT FREE :ctx1; EXEC SQL CONTEXT FREE :ctx2; EXEC SQL CONTEXT FREE :ctx3; } /****************************************************************/ /*************************** THREAD 1 ***************************/ /****************************************************************/ #ifdef WIN32 void __stdcall th1(void*p) #else #ifdef UNIX void * th1(void*p) #endif #endif { struct sqlca sqlca; EXEC SQL MODULE M1; EXEC SQL CONTEXT USE :ctx1; EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; printf ("Thr1 : PCIA_Connect()\n"); EXEC SQL PREPARE ST FROM select name, city from person where Age < =30; EXEC SQL DECLARE CR CURSOR_PCI FOR ST; EXEC SQL OPEN CR; printf ("Thr1 : PCIA_Open()\n"); for(;;) { EXEC SQL WHENEVER NOT FOUND GOTO not_found; EXEC SQL FETCH CR INTO :name, :city; printf("\nThr1: Name is : %s; City is : %s;", name, city); printf ("\nThr1 : PCIA_Fetch()"); } not_found: EXEC SQL CLOSE CR; printf ("Thr1 : PCIA_Close()\n"); EXEC SQL COMMIT RELEASE; printf ("Thr1 : PCIA_CommRoll()\n"); sqlerr: printf ("Thr1 Error: %ld\n",ErrPCI(ctx1)); EXEC SQL END MODULE M1; Wth1=0; #ifdef WIN32 _endthreadex(0); #else #ifdef UNIX pthread_exit(&Wth1); return Wth1; #endif #endif } /****************************************************************/ /***************************** THREAD 2 *************************/ /****************************************************************/ #ifdef WIN32 void __stdcall th2(void*p) #else #ifdef UNIX void * th2(void*p) #endif #endif { struct sqlca sqlca; EXEC SQL MODULE M2; EXEC SQL CONTEXT USE :ctx2; EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; printf ("Thr2 : PCIA_Connect()\n"); EXEC SQL PREPARE ST FROM select name, city from person where Age < =30; EXEC SQL DECLARE CR CURSOR_PCI FOR ST; EXEC SQL OPEN CR; printf ("Thr2 : PCIA_Open()\n"); for(;;) { EXEC SQL WHENEVER NOT FOUND GOTO not_found; EXEC SQL FETCH CR INTO :name, :city; printf("\nThr2: Name is : %s; City is : %s;", name, city); printf ("\nThr2 : PCIA_Fetch()"); } not_found: EXEC SQL CLOSE CR; printf ("Thr2 : PCIA_Close()\n"); EXEC SQL COMMIT RELEASE; printf ("Thr2 : PCIA_CommRoll()\n"); sqlerr: printf ("Thr2 Error: %ld\n",ErrPCI(ctx2)); EXEC SQL END MODULE M2; Wth2=0; #ifdef WIN32 _endthreadex(0); #else #ifdef UNIX pthread_exit(&Wth2); return &Wth2; #endif #endif } /****************************************************************/ /**************************** THREAD 3 **************************/ /****************************************************************/ #ifdef WIN32 void __stdcall th3(void*p) #else #ifdef UNIX void * th3(void*p) #endif #endif { struct sqlca sqlca; EXEC SQL MODULE M3; EXEC SQL CONTEXT USE :ctx3; EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; printf ("Thr3 : PCIA_Connect()\n"); EXEC SQL PREPARE ST FROM select name, city from person where Age < =30; EXEC SQL DECLARE CR CURSOR_PCI FOR ST; EXEC SQL OPEN CR; printf ("Thr3 : PCIA_Open()\n"); for(;;) { EXEC SQL WHENEVER NOT FOUND GOTO not_found; EXEC SQL FETCH CR INTO :name, :city; printf("\nThr3: Name is : %s; City is : %s;", name, city); printf ("\nThr3 : PCIA_Fetch()"); } not_found: EXEC SQL CLOSE CR; printf ("Thr3 : PCIA_Close()\n"); EXEC SQL COMMIT RELEASE; printf ("Thr3 : PCIA_CommRoll()\n"); sqlerr: printf ("Thr3 Error: %ld\n",ErrPCI(ctx3)); EXEC SQL END MODULE M3; Wth3=0; #ifdef WIN32 _endthreadex(0); #else #ifdef UNIX pthread_exit(&Wth3); return Wth3; #endif #endif } /****************************************************************/ /************************ END OF SOURCE**************************/ /****************************************************************/