PROC的多线程

///

在main中进行context的初始化

//

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include <sqlda.h>
#include <process.h>

typedef unsigned (WINAPI * PBEGINTHREADEX_THREADFUNC)(LPVOID lpThreadParameter);
typedef unsigned * PBEGINTHREADEX_THREADID;

EXEC SQL BEGIN DECLARE SECTION;
#define THREADS 2
struct parameters
{
    sql_context *ctx;
int thread_id;
};
typedef struct parameters parameters;
char username[20],password[20],server[20];
EXEC SQL END DECLARE SECTION;

void sql_error(struct sqlca);
void logon(sql_context);
void logoff(sql_context);
void query1(parameters *);
void query2(parameters *);

void main(int argc,char ** argv)
{
   EXEC SQL BEGIN DECLARE SECTION;
       sql_context ctx[THREADS];
   EXEC SQL END DECLARE SECTION;
  
   HANDLE thread[THREADS];
   DWORD threadid[THREADS];
   parameters params[THREADS];
   int i;
   char *connstr,*pos;
  
   connstr=(char*) malloc(sizeof(char)*(strlen(argv[1])+1));
   strcpy(connstr,argv[1]);
  
   if (pos=strchr(connstr,'/'))
{
      connstr[pos-connstr]='/0';
      strcpy(username,connstr);
   connstr=pos+1;
}

if (pos=strchr(connstr,'@'))
{
      connstr[pos-connstr]='/0';
      strcpy(password,connstr);
   connstr=pos+1;
}

strcpy(server,connstr);



   EXEC SQL ENABLE THREADS;
   EXEC SQL WHENEVER SQLERROR DO sql_error(sqlca);
  
   for(i=0;i<THREADS;i++)
   {
     printf("start thread %d /n",i+1);
EXEC SQL CONTEXT ALLOCATE :ctx[i];
logon(ctx[i]);
   }
  
    for(i=0;i<THREADS;i++)
{
   params[i].ctx=ctx[i];
   params[i].thread_id=i;
   switch(i)
   {
      case 0:
     thread[i]=(HANDLE) _beginthreadex(NULL,0,(PBEGINTHREADEX_THREADFUNC) query1,&params[i],0,(PBEGINTHREADEX_THREADID)&threadid[i]);
           printf("%d thread start/n",i+1);
           break;    
      case 1:
     thread[i]=(HANDLE) _beginthreadex(NULL,0,(PBEGINTHREADEX_THREADFUNC) query2,&params[i],0,(PBEGINTHREADEX_THREADID)&threadid[i]);
           printf("No.%d thread start/n",i+1);
           break;  
    }
  
}
  
    for(i=0;i<THREADS;i++)
{
   DWORD dwRet = WaitForMultipleObjects(THREADS,thread,TRUE,INFINITE);
   logoff(ctx[i]);
   EXEC SQL CONTEXT FREE :ctx[i];
}
  
  
}

void query1(parameters *param)
{
struct sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
     long art_no;
char descr[33];
EXEC SQL END DECLARE SECTION;
sql_context ctx;
ctx=param->ctx;
EXEC SQL WHENEVER SQLERROR DO sql_error(sqlca);
EXEC SQL CONTEXT USE :ctx;
EXEC SQL select art_no,descr into :art_no,:descr from article where art_no=10;
printf("%d%s/n",art_no,descr);
}


void query2(parameters *param)
{
struct sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
     long art_no;
char descr[33];
EXEC SQL END DECLARE SECTION;
sql_context ctx;
ctx=param->ctx;
EXEC SQL WHENEVER SQLERROR DO sql_error(sqlca);
EXEC SQL CONTEXT USE :ctx;
EXEC SQL select art_no,descr into :art_no,:descr from article where art_no=24;
printf("%d%s/n",art_no,descr);
}

void sql_error(struct sqlca sqlca)
{
if(sqlca.sqlcode <0)
{
     printf("error/n");
}
exit(1);
}


void logon(sql_context ctx)
{
   EXEC SQL CONTEXT USE :ctx;
   EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
}

void logoff(sql_context ctx)
{
   EXEC SQL CONTEXT USE :ctx;
   EXEC SQL COMMIT WORK RELEASE;
}

//

编译

/

proc iname=D:/proc/ora_thread1/ora_thread1.pc oname=D:/proc/ora_thread1/ora_thread1.c parse=full include=D:/orant/precomp/public include="d:/Program Files/Microsoft Visual Studio/VC98/Include" threads=yes

 

 

转自:http://hi.baidu.com/zmjeffwc/blog/item/f4d0bd24ba5c943ac995590d.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值