kenlistian

厚积薄发. 勤为桨,思为帆

   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  73 随笔 :: 4 文章 :: 22 评论 :: 0 Trackbacks

这是我做的测试例子,考虑到一个线程用于去读数据库,一次性插入多条数据到共享数据区,另外搞2个上的线程去读这个共享数据区,以后打算搞个线程池来处理读部分。

目下的问题是我想把这个共享数据区做成可变化的动态区,当读入数据大时,一次读入全部读完。当数据量小时,则在规范范围的空间中运行。

采用vector<mystructData>方式动态变化,比如要删除超过长度之外的设置,只需要earse就可以了,在线程中每次通过begin,end自动扫描处理中数据部分。

如果把线程部分放到dll中,那么考虑到如何读取共享数据区,采用导出函数方式,把主线程中的一个函数地址传入到dll中,然后在这个函数中通过

find_if(a.begin(),a.end(),myfunc)照样可以处理dll中跑线程的问题,之所以考虑用dll分离各个线程部分,是考虑到业务不同时,每个dll处理扫描共享数据区,发现自己的业务就去处理,不是则不理会,这样考虑设计可以通过编写dll方式来扩展不同的业务。


#include "stdafx.h"
#include <vector>
#include <iostream>
#include <windows.h>
#include <process.h>
#include <algorithm>

using namespace std;

struct te
{
 int IsGet;
 int a1;
 int s1;
 char b1[20];
};

bool isget(te t)
{
 return t.IsGet ==1;
}
bool getdata(te t)
{
 return t.IsGet==0;
}
vector<te> a; 
HANDLE hMutex;

void myprint(te t)

 cout<<"   ALL "<< (t.IsGet == 0? "Have": "No ")<< "("<<t.a1<<")"<<t.s1<<" " << t.b1 <<endl;
  
}

DWORD WINAPI insertdata( LPVOID lpParam )

 vector<te>::iterator p; 
 int i = 0;
 while (1)
 {  

  do{
   
    p = find_if(a.begin(), a.end(), isget);  
    if (p!= a.end())
    {      
   WaitForSingleObject(hMutex, INFINITE);
   i++;
   p->IsGet = 0; 
   p->s1 = i;
   sprintf(p->b1, "%s- %d", "thread_insert" , i); 
      cout<<" insert("<<p->a1<<") " << p->s1<<"  " << p->b1 <<endl;  
      ReleaseMutex(hMutex);
    }
    //Sleep(1000);
   
  }
  while(p != a.end());
  
  WaitForSingleObject(hMutex, INFINITE);
  cout<<"---------------------------"<<endl;
  for_each(a.begin(), a.end(), myprint);
  ReleaseMutex(hMutex);  
  Sleep(11000);
 }


 return 0;
}

//读线程,读完对IsGet标志为1
DWORD WINAPI processdata( LPVOID lpParam )
{
 vector<te>::iterator p;
 
 while(1)
 {
  WaitForSingleObject(hMutex, INFINITE);
  p = find_if(a.begin(), a.end(), getdata);
  if (p != a.end())
  {   
    cout<<"("<< (char*)lpParam << ") get (" << p->a1<<") " << p->s1 <<" " << p->b1 <<endl;   
    p->IsGet = 1;   
    p->s1 = 0;
    p->b1[0] = '\0';
  
  }  
  ReleaseMutex(hMutex);
  Sleep(500);
 }

 return 0;
}

int main(int argc, char* argv[])
{
 
 HANDLE hInsertHandle, hProcessHandle1,hProcessHandle2;
 DWORD dwThreadId;

 te tt1;
 for(int i = 0; i < 10;i++)
 {
  tt1.IsGet = 1;             //可以写入标志
  tt1.a1 = i;
  tt1.s1 = 0;
  sprintf(tt1.b1,"%d", i);
  a.push_back(tt1);
 }

 hMutex = CreateMutex(NULL, false, "mutex");

  hInsertHandle = CreateThread(
        NULL,                 
        0,                    
  insertdata,        
        NULL,                   // argument to thread function
        0,                           // use default creation flags
        &dwThreadId);
 
  hProcessHandle1 = CreateThread(  //读出线程1
        NULL,                 
        0,                    
  processdata,        
        "proc1" ,              
        0,                     
        &dwThreadId);
    hProcessHandle2 = CreateThread(
        NULL,                 
        0,                    
  processdata,        
        "proc2",            
        0,                  
        &dwThreadId);

 
 while(1)
 { 
  printf("main thread ...\n");
  char c = getchar();
  if (c== 'q')
   break;
 }

 return 0;
}

posted on 2006-05-28 15:27 kenlistian 阅读(3245) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理