??xml version="1.0" encoding="utf-8" standalone="yes"?>
"delete from tb_Cards" // 清空
"ALTER TABLE tb_Cards ALTER COLUMN idx COUNTER (1, 1)" // 自动~号设ؓ1
在CDialog::PreTranslateMessage() 的重载函CESC和回车按键的消息处理?
CResultCollectorDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN) {
switch(pMsg->wParam) {
case VK_RETURN: //回R
return TRUE;
case VK_ESCAPE: //ESC
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
调试快捷?br />调试.断点 F9 讄或取消断?br />调试.启用断点 Ctrl + F9 断点从用切换到启?br />调试.删除所有断?nbsp; Ctrl + Shift + F9 清除目中的所有断炏V?/p>
文本选择快捷?br />~辑.向左扩展一个字W?nbsp; Shift + 向左?nbsp; 光标左UM个字W以扩展所选内宏V?br />~辑.向右扩展一个字W?nbsp; Shift + 向右?nbsp; 光标右UM个字W以扩展所选内宏V?br />~辑.文档l尾扩展 Ctrl + Shift + End 选择从插入点到文最后一行的文本?br />~辑.文档开始扩?nbsp; Ctrl + Shift + Home 选择从插入点到文档首行的文本?br />~辑.向下扩展一?nbsp; Shift + 向下?nbsp; 从插入点位置开始,选定文本向下扩展一行?br />~辑.扩展到行?nbsp; Shift + End 选择从插入点到当前行行尾的文本?br />~辑.扩展到行?nbsp; Shift + Home 选择从插入点到行首的文本?br />~辑.向上扩展一?nbsp; Shift + 向上?nbsp; 从插入点位置开始向上逐行选择文本?
~辑.向下扩展一?nbsp; Shift + Page Down 选定内容向下扩展一c?br />~辑.向上扩展一?nbsp; Shift + Page Up
对象览器快捷键
~辑.转到声明 Ctrl + F12 昄代码中选定W号的定义?br />~辑.转到定义 F12 昄代码中选定W号的声明?/p>
cdpd快捷?br />cdpd.折叠 数字键区中的 -Q减P 折叠“c详l信?#8221;H口中展开的节点,或折叠关pd中选定的Ş犉舱?
cdpd.展开 数字键区中的 +Q加P 展开“c详l信?#8221;H口中折叠的节点Q或展开关系图中选定的Ş犉舱?/p>
// Tokenizes a string into a vector
std::vector<std::string> TokenizeString(const std::string& str, const std::string& delim)
{
// http://www.gamedev.net/community/forums/topic.asp?topic_id=381544#TokenizeString
using namespace std;
vector<string> tokens;
size_t p0 = 0, p1 = string::npos;
while(p0 != string::npos)
{
p1 = str.find_first_of(delim, p0);
if(p1 != p0)
{
string token = str.substr(p0, p1 - p0);
tokens.push_back(token);
}
p0 = str.find_first_not_of(delim, p1);
}
return tokens;
}一下内容在vs2005实现
新徏一个空的win32控制台项?
1.首先我们来配|头文g和库文g:
头文?
D:\Lua\lua-5.1.4\src
D:\Lua\luabind-0.8.1
D:\Lua\boost_1_41_0

库文??见代?
下面是cpp内容?注释都是个h理解,如果您觉得不?/p>
#include <luabind/luabind.hpp>
#pragma comment(lib,"lualib.lib") //可能你会?lualib.lib是哪里来? q是我自q译luabind得到
//? 如果你不知道怎么~译,参考下我的另一文?lt;从零开始用luabind>
#include <iostream>
using namespace std;
using namespace luabind;

class testlua//写一个测试类,包括一些简单的Ҏ.
{
public:
testlua(std::string s):m_str(s){};
void myprint()
{
cout << m_str << endl;
}
void setstr(std::string s){ m_str = s;};
private:
std::string m_str;
};

int main()
{
lua_State *L = luaL_newstate();//新徏一个lua_State,或者叫做创建lua状?/span>
luabind::open(L);//为改lua状态打开所有lua?br />
//把写好的cȝ定到lua,以下内容书所?我看的是missdeer同学译的luabindmanual一?
//怿好学的你,如果不明白这是怎么用的,一定会找来q书Mȝ,当然我也很乐意和您分?Q:625425901)
module(L)
[
class_<testlua>("testlua")
.def(constructor<const std::string>())
.def("myprint",&testlua::myprint)//开放这两个函数llua使用
.def("setstr", &testlua::setstr)
];
luaL_dofile(L,"test.lua");//执行lua文g,E后你会看到test.lua文g的内?/span>
lua_close(L);//关闭lua状?/span>
return 0;
}

以下是test.lua内容:

local a = testlua("hello lua!");--看不?/span>?如果我说它在c里是q样? testlua obj = testlua("hello lua!"),看懂了么??构徏testluacȝ对象.
a:myprint();//调用Ҏ
a:setstr("yes lua!");
a:myprint();

--接下来我们在lua里尝试如下代?
a:hisprint();
--你也怼?q个函数不存在啊.实不存?但是E序q没有报?所以或许我们需要其他的代码来处理这U错误的调用,后话?慢慢?

好了,执行一下C代码,你应该会看到惌的结果了.怿不少同学看到q里已经开始计划写一个类,用来随心所Ʋ的开放你的CҎllua使用?先到q里.
Ƣ迎批评指正.
使用vs2005~译luabind
U色部分是我自己~译的时候遇到的一些问?或者应该注意的地方
另外,我修改了boost_1_41_0\tools\build\v2\user-config.jam文g中的 # using msvc : 8.0;
改后: # using msvc : 8.0 : : <compileflags>/wd4819 <compileflags>/D_CRT_SECURE_NO_DEPRECATE <compileflags>/D_SCL_SECURE_NO_DEPRECATE <compileflags>/D_SECURE_SCL=0 ;
不知道这会不会对~译造成影响.
U程分ؓ界面U程和工作者线E,界面实际是一个线E画出来的东西,q个U程l护一?#8220;消息队列”Q?#8220;消息队列”也是界面U程和工作者线E的最大区别,q个词应该进C的脑子里Q根p固的Q?/p>
如果在界面线E的某个地方停住Q这说明它处理不了窗口消息了Q所以有时候我们就会看到整个界面无响应了。这U问题后面会提供一个叫 WaitForObjectEx 的函数来解决Q我们后面再谈?/p>
U程首先是它的创徏Q创建是用下面这个函敎ͼCreateThread; 具体的参数我不说了,自己查QIQ。其中的 Thread1 是线E函数。线E函数是一个全局函数Q如下:
DWORD WINAPI Thread1(LPVOID lpParam)
{
while(1)
{
OutputDebugString("11111");
Sleep(10);
}
return 0;
}
// 下面q一句是创徏U程
CreateThread(NULL, 0, Thread1, 0, 0, NULL);
当然我们不能让一个线E自生自灭,那样有可能在你退出程序的时候出C些莫名其妙的问题Q或者丢׃些数据,或者给你弹一个崩溃的对话框等{。。?/p>
所以我们就要对q个U程q行理Q首先就是让它退出?/p>
我们l它的while加上一?BOOL 变量 g_bExitThread的判断,q样的话Q线E函数就变成下面q样Q?/p>
DWORD WINAPI Thread1(LPVOID lpParam)
{
while(!g_bExitThread)
{
OutputDebugString("11111");
Sleep(10);
}
return 0;
}
然后在需要它退出的时候把g_bExitThread设ؓTRUEQ表C,喂,兄弟Q你该退Z?/p>
当然我们q要知道它是否成功退ZQ因为线E句柄是一个内核对象,所以我们就要用到Windows的WaitForSingleObject来等待了。创建的时候和{待它退出的代码p改变了,多了一?HANDLE g_hTrd的变量:
// 创徏
g_bExitThread = FALSE;
g_hTrd = CreateThread(NULL, 0, Thread1, 0, 0, NULL);
// {待U程l束
g_bExitThread = TRUE;
if(g_hTrd != NULL)
{
DWORD dwRet = WaitForSingleObject(g_hTrd, 5000);
if(dwRet == WAIT_OBJECT_0)
{
AfxMessageBox("Thread exit success!");
}
else
{
DWORD dwRet = 0;
GetExitCodeThread(g_hTrd, &dwRet);
TerminateThread(g_hTrd, dwRet);
AfxMessageBox("Thread exit, but not all ok!");
}
CloseHandle(g_hTrd);
g_hTrd = NULL;
}
上面说了在界面线E里{待别的U程l束Q也是使用 WaitForSingleObject 的时候会d整个H口消息的处理,所以我们如果在界面U程里要{待别的内核对象Ӟ我们要采用这U?#8220;{一下,处理一下界面消?#8221;的方法。我已经写好了一?WaitForObjectEx 的函敎ͼ如下Q?/p>
// 此函数只能用于界面线E?br />static DWORD WaitForObjectEx( HANDLE hHandle, DWORD dwMilliseconds )
{
BOOL bRet;
MSG msg;
INT iWaitRet;
int nTimeOut = 0;
while( (bRet = ::GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if(nTimeOut++ * 20 >= dwMilliseconds)
break;
iWaitRet = WaitForSingleObject(hHandle, 20);
if(iWaitRet != WAIT_TIMEOUT)
{
break;
}
if (bRet == -1)
{
break;
}
else
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
return iWaitRet;
}
很多时候,我们不想把线E作Z个全局函数来用,所以这个时候我们把U程作ؓ一个类的静态成员对象来写。当然也不能了刚才的两个变量:退出标志和U程句柄。(设这个类是CTestThreadDlgQ?/p>
// H 文g
BOOL m_bExitThread;
HANDLE m_hTrd;
static DWORD WINAPI Thread1(LPVOID lpParam);
// CPP文gQ创建的时候把 this 指针传进去,因ؓc静态成员函C能访问类的非静态成员,没有this指针
//QC++的知识点Q?br /> m_bExitThread = FALSE;
m_hTrd = CreateThread(NULL, 0, Thread1, this, 0, NULL);
U程函数变成了:
DWORD WINAPI CTestThreadDlg::Thread1(LPVOID lpParam)
{
CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;
while(!pDlg->m_bExitThread)
{
OutputDebugString("11111");
Sleep(10);
}
return 0;
}
当有几个U程一赯的时候,我们p注意U程的同步问题了Q线E的同步一般来_是在多个U程q了资源的时候。比如两个线E都用到了同一个VECTORQ都对VECTORq行插入操作Q不q的是,VECTOR不是U程安全的,q个时候程序就会崩溃,所以我们就要对VECTORq个资源做同步,同步的意思是“我访问的时候,你等?#8221;。程序大致如下:
DWORD WINAPI CTestThreadDlg::Thread1(LPVOID lpParam)
{
CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;
while(!pDlg->m_bExitThread)
{
OutputDebugString("11111");
pDlg->m_csForVec.Lock();
pDlg->m_vecTest.push_back("111");
pDlg->m_csForVec.Unlock();
Sleep(10);
}
return 0;
}
DWORD WINAPI CTestThreadDlg::Thread2(LPVOID lpParam)
{
CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;
while(!pDlg->m_bExitThread2)
{
OutputDebugString("222");
pDlg->m_csForVec.Lock();
pDlg->m_vecTest.push_back("222");
pDlg->m_csForVec.Unlock();
Sleep(10);
}
return 0;
}
m_csForVec 是一个CCriticalSection变量Q这个同步对象和其他的同步变量(事g、信号量、互斥区{)有一些不一P例如只能在同一个进E的U程间访问、在操作pȝ的用h访问,其他的必进入核心态。所以这样导致了q种关键区的核心对象的速度要比其他的快100倍左叟뀂。?/p>
上面已经说了U程的创建、管理(退出线E、等待线E)、同步等Q那我们发现了什么共性呢Q作Z个程序员Q我们要很敏感的发现q些代码上的共性,q是我们设计代码的主要前提?/p>
首先我们发现上面的线E都有两个变量:
BOOL m_bExitThread; // 让线E退出的标志
HANDLE m_hTrd; // U程句柄
另外我们WaitForSingleObject 的时候不能无限等待,所以要多一?DWORD m_dwWaitTimeOut;
׃我想把线E启动和l束装hQ所以我设计了这几个接口Q?/p>
BOOL Start(LPVOID lpParam); // 启动U程Q线E所需要的参数从这里传q?br /> BOOL End(); // l束U程
virtual void Run(); // 重写Run函数
所以整个的U程装成以下的c:
// MyThread.h
#ifndef MY_THREAD_H
#define MY_THREAD_H
class CMyThread
{
public:
CMyThread();
virtual ~CMyThread();
BOOL Start(LPVOID lpParam);
BOOL End();
virtual void Run();
protected:
static DWORD WINAPI Thread(LPVOID lpParam);
void RunOnceEnd();
DWORD m_dwWaitTimeOut;
BOOL m_bExitThread;
HANDLE m_hTrd;
LPVOID m_lpParam;
};
#endif
// MyThread.Cpp
#include "stdafx.h"
#include "MyThread.h"
/////////////////////////////////////////////////////////////////////////////
// CMyThread
CMyThread::CMyThread()
{
m_bExitThread = FALSE;
m_hTrd = NULL;
m_dwWaitTimeOut = 5000;
}
CMyThread::~CMyThread()
{
}
BOOL CMyThread::Start(LPVOID lpParam)
{
m_lpParam = lpParam;
m_bExitThread = FALSE;
m_hTrd = CreateThread(NULL, 0, Thread, this, 0, NULL);
return TRUE;
}
BOOL CMyThread::End()
{
m_bExitThread = TRUE;
if(m_hTrd != NULL)
{
DWORD dwRet = WaitForSingleObject(m_hTrd, m_dwWaitTimeOut);
if(dwRet == WAIT_OBJECT_0)
{
AfxMessageBox("Thread exit success!");
}
else
{
DWORD dwRet = 0;
GetExitCodeThread(m_hTrd, &dwRet);
TerminateThread(m_hTrd, dwRet);
AfxMessageBox("Thread fucking exit!");
}
CloseHandle(m_hTrd);
m_hTrd = NULL;
}
return TRUE;
}
DWORD WINAPI CMyThread::Thread(LPVOID lpParam)
{
CMyThread *pTrd = (CMyThread *)lpParam;
while(!pTrd->m_bExitThread)
{
pTrd->Run();
}
return 0;
}
void CMyThread::RunOnceEnd()
{
m_bExitThread = TRUE;
CloseHandle(m_hTrd);
m_hTrd = NULL;
}
void CMyThread::Run()
{
}
我们需要写我们自己的线E的时候就重蝲一下这个Run函数
// zZ个类
class CMyThread1 : public CMyThread
{
public:
virtual void Run();
};
// 改写Run函数
void CMyThread1::Run()
{
CTestThreadDlg *pDlg = (CTestThreadDlg *)m_lpParam;
OutputDebugString("222");
pDlg->m_csForVec.Lock();
pDlg->m_vecTest.push_back("222");
pDlg->m_csForVec.Unlock();
Sleep(10);
// 如果此线E只惌行一ơ,加上下面q句
RunOnceEnd();
}
然后我们之前的两个线E的使用变成了下面的Ş式:
CMyThread1 g_t1, g_t2, g_t3;
void CTestThreadDlg::OnButton3()
{
g_t1.Start(this);
g_t2.Start(this);
g_t3.Start(this);
}
void CTestThreadDlg::OnButton4()
{
g_t1.End();
g_t2.End();
g_t3.End();
}
只需要以下几步:
1、派生自qU程c?br />2、重载Run函数
3、调用Start启动U程
4、调用Endl束U程
当然q种装方式是我自己喜欢的,装的目的是方便使用Q隐藏细节,怽看官也可以根据自q喜好Q封装线E的使用ҎQ如果能在此公开一下你的成果,让我和大安学习一下你的设计手法,那就真是very good and 3q了!
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/dylgsy/archive/2008/03/13/2176160.aspx
//-------------------------------------------
//当想在Win32 Application时想在控制台输出一些调?br>
//信息,可以先创Z个控制台,再重定向输入,输出
//-------------------------------------------
AllocConsole();
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
int hCrt = _open_osfhandle((long)handle,_O_TEXT);
FILE * hf = _fdopen( hCrt, "w");
*stdout = *hf;
setvbuf( stdout, NULL, _IONBF, 0 );
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN); //改变控制台文本颜?/span>