在C++程序中添加逻辑流程控制
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-30
rl; url.parse_url("http://user:pass@abc.com:80/abc/def/ ghi.php?jklmn=1234&opq=567#rstuvw"); printf("schema=%s\nuser=%s\npass=%s\nhost=%s\nport=%s\nuri=%s\ nparam=%s\nanchor=%s\n", url.scheme.c_str(), url.user.c_str(), url.pass.c_str(), url.host.c_str(), url.port.c_str(), url.uri.c_str(), url.param.c_str(), url.anchor.c_str()); return 0; } //vflow.h #ifndef _VFLOW_H_ #define _VFLOW_H_ #ifdef WIN32 #include <windows.h> #else #include <pthread.h> #endif #ifdef __cplusplus extern "C" { #endif typedef #ifdef WIN32 DWORD #else pthread_t #endif VF_THREAD_ID; typedef void (*LPVFLOW_START_ROUTINE)(void* param); typedef struct STRU_VIRTUAL_FLOW { VF_THREAD_ID thread_id; struct STRU_VIRTUAL_FLOW* map_prev; struct STRU_VIRTUAL_FLOW* map_next; struct STRU_VIRTUAL_FLOW* evt_next; unsigned short status; // 1 means exit #ifdef WIN32 HANDLE evt; #else pthread_mutex_t mut; pthread_cond_t cond; #endif LPVFLOW_START_ROUTINE routine; void* param; } VIRTUAL_FLOW; typedef struct { VIRTUAL_FLOW* first; VIRTUAL_FLOW* last; } VIRTUAL_FLOW_EVENT; //声明一个流程事件 #define VFLOW_EVENT_DECLARE(evt) \ VIRTUAL_FLOW_EVENT vf_##evt; #define VFLOW_EVENT_INITIALIZE(evt) \ vf_##evt.first = vf_##evt.last = NULL; #define VFLOW_START vf_start //添加到等待队列 #define VFLOW_WAIT(evt) \ vf_wait(&vf_##evt); //给等待事件的流程发信号 #define VFLOW_SIGNAL(evt) \ vf_signal(&vf_##evt); //结束等待某一事件的所有流程 #define VFLOW_TERMINATE(evt) \ vf_terminate(&vf_##evt); #define VFLOW_EXIT vf_exit void vf_start(LPVFLOW_START_ROUTINE routine, void* param); void vf_wait(VIRTUAL_FLOW_EVENT* evt); void vf_signal(VIRTUAL_FLOW_EVENT* evt); void vf_terminate(VIRTUAL_FLOW_EVENT* evt); void vf_exit(); #ifdef __cplusplus } #endif #endif // _VFLOW_H_ //vflow.c #include "vflow.h" #include <stdlib.h> #include <string.h> #ifndef WIN32 #include <sys/types.h> #include <linux/unistd.h> #endif #define VF_MAP_SIZE 17 int g_vf_init = 0; VIRTUAL_FLOW* g_vf_map[VF_MAP_SIZE]; #ifdef WIN32 #define GetThreadId GetCurrentThreadId #else #define GetThreadId pthread_self #endif //基于线程ID,从g_vf_map中获取virtual_flow //如果bCreate = 1,且它不存在,就创建一个。 //否则,如果它存在,从图中删除它。 VIRTUAL_FLOW* get_my_vf(unsigned int bCreate) { VF_THREAD_ID thread_id = GetThreadId(); int n = ((unsigned char)(thread_id >> 24) + (unsigned char) (thread_id >> 16) + (unsigned char)(thread_id >> 8) + (unsigned char)thread_id) / VF_MAP_SIZE; VIRTUAL_FLOW** ppVF = g_vf_map + n; VIRTUAL_FLOW* pVF, *pVF2; if (*ppVF == NULL) { if (!bCreate) return NULL; pVF = (VIRTUAL_FLOW*)malloc(sizeof(VIRTUAL_FLOW)); pVF->map_prev = pVF->map_next = pVF->evt_next = NULL; *ppVF = pVF; } else { pVF = *ppVF; while (1) { if (pVF->thread_id == thread_id) { if (bCreate) return pVF; if (pVF == *ppVF) { *ppVF = pVF->map_next; if (*ppVF) (*ppVF)->map_prev = NULL; } else { pVF->map_prev-> |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 一步一步实现MFC扩展DLL中导出类和对话框下一篇: volatile关键字的说明以及测试
关于在C++程序中添加逻辑流程控制的所有评论