首页 | 摘要显示 | 上一页 1 2 3 4 5 6 7 8 9 10 下一页

Developer Archives

May 17, 2007

使用Oracle Chart Builder在页面上画图

    现在总是翻以前的东西, 将要介绍给大家的是我在03年写的一个在页面上画图的Java程序, 我将它命名为WebChart, 是基于Oracle Chart Builder库的, 用Java实现的一个Servlet. 程序可以运行在Tomcat 4以上或Resin 2以上的环境中.

    现在给大家展示一张用它画的图:

A chart by program

    有兴趣的话可以下载WebChart, 然后解压到Tomcat的webapps目录下, 然后将Oracle的JDBC驱动拷到Tomcat的common\lib目录下. 然后更改webchart\WEB-INF目录下的dbconn.cfg文件, 以配置数据库连接信息:

DEFAULT.DBTYPE=oracle
DEFAULT.DBHOST=host:port:sid
DEFAULT.DBUSER=username
DEFAULT.DBPASS=password

    接下来启动Tomcat, 就可以访问几个演示了, 访问的地址如下:

http://localhost:8080/webchart/sample1.wcml
http://localhost:8080/webchart/sample2.wcml
http://localhost:8080/webchart/sample3.wcml

    如果不能工作, 则请告诉我. 我将在后面介绍如何用它来作出不同的图. 上面的图是用如下的SQL语句作出来的:

SELECT
  OBJECT_TYPE,
  SUM(OBJECT_ID) SUMOBJ,
  SUM(DATA_OBJECT_ID)*dbms_random.value SUMOBJD
FROM USER_OBJECTS
where data_object_id  is not null
GROUP BY OBJECT_TYPE

    然后用默认的xsl模板来生成HTML展现出来.

August 8, 2007

Windows Visual C++多线程(Thread)编程示例

    以前总以为用C来编写多线程序是一件很难的事, 但事实上并不是很复杂, 下面就是今天参考网上例子写出来的一段程序.

#include <process.h>
#include <stdio.h>
#include <stdlib.h>

void Child( void* pParams )
{
   char *data = (char *) pParams;
   printf("Child first (%s) !\n", data);
   _endthread();
}
  
int main( void )
{
   char data[] = "1234567890";
   _beginthread( Child, 0, (void *)data);
   _sleep(10);
   printf("Parent later!\n");
   return 0;
}

    用"cl /MT"命令编译后, 运行的结果如下:

C:\TEMP>test
Child first (1234567890) !
Parent later!

    研究多线程的原因是想并行执行几个SQL语句, 及定时发出SQL查询请求.

Unix/Linux上C语言fork多个进程的代码示例

    下面一段代码算是一个完整的例子了, 纪念一下.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   pid_t pid;
  
   /* Remove the defunc pid in process table */
   signal(SIGCLD, SIG_IGN);

   while(true)
   {
      switch(pid=fork())
      {
         case -1:
           printf("Fork failured!\n");
           break;
         case 0:
           printf("This is child thread!\n");
           _exit(0);
           break;
         default:
           printf("Child process %d created!\n", pid);
           sleep(10);
           break;
      }
   }
}

    以前总是没有写signal一行.

August 9, 2007

Unix/Linux下C语言POSIX多线程程序示例

    原想用fork机制来实现多个任务并发的, 结果始终没有搞定其中的数据共享问题, 就换成用POSIX线程算了.

#include <pthread.h>
#include <stdio.h>

void *subCall(void *param)
{
  int *p = param;
  (*p) ++;
  return NULL;
}

int main()
{
   int i, *p=NULL;
   int err;
   pthread_t pid;
   p = (int *) malloc(sizeof(int));
   *p = 10;
   for(i=0;i<3;i++)
   {
       err=pthread_create(&pid, NULL , subCall, p);
       sleep(1);
       printf("wait 1 second! -- err=%d, tid=%d, val=%d\n\n", err,pid, (*p));
   }
   free(p);
   return 0;
}

    在编译时要加上"-lpthread", 否则的话程序不能工作在多线程模式下.

gcc -o test -l pthread test.c

    目标是由线程来将主程序中的数据加一, 结果完成我的要求.

wait 1 second! -- err=0, tid=4, val=11

wait 1 second! -- err=0, tid=6, val=12

wait 1 second! -- err=0, tid=7, val=13

    好象线程模式更容易理解啊.

August 11, 2007

切换到OCIThread多线程编程环境

    多线程的事困扰我好久了, 最初用fork遇到了进程间数据共享的问题, 改成vfork则主进程要等子进程结束后才继续. 后成改成用POSIX的线程(pthread)来写, 结果跑了一天, 我的OCI程序挂起了, 原因是遇到了一个Bug. 今天在网上搜索后发OCIThread, 就是Oracle包装了一层之后的多线程编程环境了. 将程序改了一下, 希望周一来时它没有挂住.

    OCIThread要求在其他的OCIThread调用之前先执行如下调用:

OCIThreadProcessInit();

    然后以OCI_THREADED方式创建OCIEnv对象, 并执行OCIThread初始化:

OCIThreadInit(seshp,errhp);

    接下来就可以创建OCI线程了, 使用下面的调用:

OCIThreadCreate(seshp, errhp, mycall, (dvoid *)param, NULL,NULL);

    当被调用的函数执行完后, 线程就自动退出了. 当然在断开连接之前得结束OCIThread, 执行如下调用:

OCIThreadTerm(seshp,errhp);

    在Windows上和Linux编译好后, 都直接支持多线程模式. 而在Solaris上则在编译是要加上"-lpthread"才能创建线程, 一开始没有加, 怎么都不能创建线程, 以为是Oracle不支持呢. 还好最后灵光突现, 加上这个, 程序正在以多线程模式跑着呢.

上一页 1 2 3 4 5 6 7 8 9 10 下一页

当前分类: Developer

Creative Commons License
本站版权: 共用创作 CC
署名-非商业性-相同方式分享
本站基于MT-3.36免费版
(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql