64位操作系统安装 MySQL-python-1.2.3.win 失败,提示 fatal error C1083: Cannot open include file: 'config-win.h',网上方案均不可行,实际上只需要直接下载 MySQL-python-1.2.3.win-amd64-py2.7.exe 安装即可。下载地址请自行搜索。
posted @ 2017-11-03 21:56 修一居士 阅读(371) | 评论 (0)编辑 收藏
1、增加windows环境变量以下路径
D:\Python26;D:\Python26\Tools\Scripts;D:\Program Files\Sublime Text 2
2、注销并重新登录,使用命令行敲入python可显示出python的版本信息
3、使用ctrl+b 如果仍然未出现编译信息,要查看ctrl+·  是否有错误信息,将错误的插件remove掉
posted @ 2012-09-16 22:03 修一居士 阅读(2708) | 评论 (0)编辑 收藏
          一直以来都说ogre渲染效率很高,最近想研究一下3d,就下来ogre的代码,看看有没有可能改改就能做游戏,没想到试了一个例子就被打击了,SkeletalAnimation 中将#define NUM_JAIQUAS 50 设为渲染50 个角色模型,渲染就只剩下4帧了。
         我的机器配置还是不错的3.0的双核intel  2G的内存 GF7600 gs 的显卡。mmorpg中同屏100人以上是很平常的事情,4帧可真的是没法玩。
posted @ 2007-07-28 22:47 修一居士 阅读(8813) | 评论 (20)编辑 收藏
1、父子二人经过五星级饭店门口,看到一辆十分豪华的进口轿车。儿子不屑地对他的父亲说:「坐这种车的人,肚子里一定没有学问!」父亲则轻描淡写地回答:「说这种话的人,口袋里一定没有钱!」 

  (你对事情的看法,是不是也反映出你内心真正的态度?) 

2、晚饭后,母亲和女儿一块儿洗碗盘,父亲和儿子在客厅看电视。突然,厨房里传来打破盘子的响声,然后一片沉寂。是儿子望着他父亲,说道:「一定是妈妈打破的。」「你怎么知道?」「她没有骂人。」 

  (我们习惯以不同的标准来看人看己,以致往往是责人以严,待己以宽。) 

3、有两个台湾观光团到日本伊豆半岛旅游,路况很坏,到处都是坑洞。其中一位导游连声抱歉,说路面简直像麻子一样。而另一个导游却诗意盎然地对游客说:诸位先生女士,我们现在走的这条道路,正是赫赫有名的伊豆迷人酒窝大道。」 

  (虽是同样的情况,然而不同的意念,就会产生不同的态度。思想是何等奇妙的事,如何去想,决定权在你。) 

4、同样是小学三年级的学生,在作文中说他们将来的志愿是当小丑。中国的老师斥之为:「胸无大志,孺子不可教也!」外国的老师则会说:「愿你把欢笑带给全世界!」 

  (身为长辈的我们,不但容易要求多于鼓励,更狭窄的界定了成功的定义。) 

5、在故宫博物院中,有一个太太不耐烦地对她先生说:「我说你为甚么走得这么慢。原来你老是停下来看这些东西。」 

  (有人只知道在人生的道路上狂奔,结果失去了观看两旁美丽花朵的机会。) 

6、妻子正在厨房炒菜。丈夫在她旁边一直唠叨不停:慢些。小心!火太大了。赶快把鱼翻过来。快铲起来,油放太多了!把豆腐整平一下!「哎厎」妻子脱口而出,「我懂得怎样炒菜。」「你当然懂,太太,」丈夫平静地答道:「我只是要让你知道,我在开车时,你在旁边喋喋不休,我的感觉如何。」 

  (学会体谅他人并不困难,只要你愿意认真地站在对方的角度和立场看问题。) 

7、理由充份:一辆载满乘客的公共汽车沿着下坡路快速前进着,有一个人後面紧紧地追赶着这辆车子。一个乘客从车窗中伸出头来对追车子的人说:“老兄!算啦,你追不上的!”“我必须追上它,”这人气喘吁吁地说:“我是这辆车的司机!” 

  (有些人必须非常认真努力,因为不这样的话,後果就十分悲惨了!然而也正因为必须全力以赴,潜在的本能和不为人知的特质终将充份展现出来。) 

8、原来如此-甲:「新搬来的邻居好可恶,昨天晚上三更半夜、夜深人静之时跑来猛按我家的门铃。」乙:「的确可恶!你有没有马上报警?」甲:「没有。我当他们是疯子,继续吹我的小喇叭。」 

  (事出必有因,如果能先看到自己的不是,答案就会不一样在你面对冲突和争执时,先想一想是否心中有亏,或许很快就能释怀了。) 

9、误会-某日,张三在山间小路开车,正当他悠哉地欣赏美丽风景时,突然迎面开来一辆货车,而且满囗黑牙的司机还摇下窗户对他大骂一声:“猪!”张三越想越纳闷,也越想越气,於是他也摇下车窗回头大骂:“你才是猪!”才刚骂完,他便迎头撞上一群过马路的猪。 

  (不要错误的诠释别人的好意,那只会让自己吃亏,并且使别人受辱。在不明所以之前,先学会按捺情绪,耐心观察,以免事後生发悔意。) 

10、後生可畏-小男孩问爸爸:“是不是做父亲的总比做儿子的知道得多?”爸爸回答:“当然啦!”小男孩问:“电灯是谁发明的?”爸爸:“是爱迪生。”小男孩又问:“那爱迪生的爸爸怎麽没有发明电灯?” 

  (很奇怪,喜欢倚老卖老的人,特别容易栽跟斗。权威往往只是一个经不起考验的空壳子,尤其在现今这个多元开放的时代。) 

11、不必紧张-小明洗澡时不小心吞下一小块肥皂,他的妈妈慌慌张张地打电话向家庭医生求助。医生说:“我现在还有几个病人在,可能要半小时後才能赶过去。”小明妈妈说:“在你来之前,我该做甚麽?”医生说:“给小明喝一杯白开水,然後用力跳一跳,你就可以让小明用嘴巴吹泡泡消磨时间了。” 

  (take it easy,放轻松放轻松些,生活何必太紧张?事情既然已经发生了,何不坦然自在的面对。担心不如宽心,穷紧张不如穷开心。) 

12、钥匙-一把坚实的大锁挂在大门上,一根铁杆费了九牛二虎之力,还是无法将它撬开。钥匙来了,他瘦小的身子钻进锁孔,只轻轻一转,大锁就“啪”地一声打开了。铁杆奇怪地问:“为什麽我费了那麽大力气也打不开,而你却轻而易举地就把它打开了呢?”钥匙说:“因为我最了解他的心。” 

  (每个人的心,都像上了锁的大门,任你再粗的铁棒也撬不开。唯有关怀,才能把自己变成一只细腻的钥匙,进入别人的心中,了解别人。)
posted @ 2007-07-25 11:55 修一居士 阅读(780) | 评论 (1)编辑 收藏
     摘要: 利用匿名管道在父子进程间传递数据 进程间传递数据有很多种方法,常用到的有命令行、共享内存、内存映射文件、剪贴板、windows消息、socket等。 命令行的缺点是数据长度限制。Windows2000只能传递256个字节,内存映射文件、共享内存都需要一些进程同步才能很好的配合读写数据,剪贴板可能会被其他进程擦数数据。当多开的时候很难控制进程间的对应关系。 一种解决方案是生成随机命名的同步...  阅读全文
posted @ 2007-05-11 00:24 修一居士 阅读(7737) | 评论 (4)编辑 收藏
用DX自绘Edit控件往往没有真是的EDIT窗口存在,所以输入法窗口无法跟随,这里给出一个解决方案

计算当前光标的位置
用API ImmSetCompositionWindow指定IME 窗口到当前光标位置
在WM_KEYDOWN消息中处理

以下是代码:

------------------------------------------------------------------------------------------------
int nSelStart = 0, nSelEnd = 0
this->GetSel( nSelStart, nSelEnd );
CPoint pntCursor 
= this->PosFromChar( nSelEnd );

if ( pntCursor.x == -1)
{
nSelEnd 
-=1
if ( nSelEnd < 0 )
{
nSelEnd 
= 0;
}

pntCursor 
= this->PosFromChar( nSelEnd );
}


HIMC hImc 
= ImmGetContext(m_hWnd);
COMPOSITIONFORM form;
form.dwStyle 
= CFS_RECT;
form.ptCurrentPos 
= CPoint(pntCursor.x,0);
form.rcArea 
= CRect(pntCursor.x,0,pntCursor.x+300,100);
ImmSetCompositionWindow(hImc,
&form);
posted @ 2007-05-11 00:16 修一居士 阅读(2581) | 评论 (0)编辑 收藏

Dump 调用堆栈的原理以及异常信息的反馈

动机:

在游戏开发过程中,我们利用 QA 部门来做产品的质量保证,尽可能将绝大部分错误消化在内部,保证游戏的版本质量,但是 QA 部门毕竟有他的局限性,尽管经过严格的测试也很难保证将所有的问题一网打尽.

 

通过在 Log 中转储的错误信息,我们可以进一步找出问题,但是 Log 文件产生在终端,我们拿到的也仅仅是公司内部测试部门产生的 Log 文件,显然公司内部得到的信息是很有限的,如果能从玩家那里拿到异常信息,我们才能最快的去解决问题,尽可能在错误产生重大影响之前将其解决,所以我们有必要从被动的获取异常信息,转为主动去获取.

 

可行性 :

       在错误发生时 Dump 调用堆栈,可以让我们知道错误发生的位置,这比已往普通的 LOG 更加有效的多.我们可以将出错的堆栈地址反馈回来.这一切在终端出现异常的时候自动进行. Windows 操作系统提供的 SEH 结构化异常机制可能让我们在程序崩溃的瞬间处理这些事情.

 

效率问题 :

       SEH windows 的异常机制,除非在编译时候特别指定不使用,否则总有默认的 SEH 处理机制, kernel32.dll 中有默认的 SEH 处理接口,当我们需要自己处理异常的时候,我们的处理点会挂接在异常处理链的最前端,这种链类似 Hook 的链.链的头部放在 fs[0] 的位置.也就是说效率的问题是可以不必考虑,

 

 

具体实现 :

       通过阅读反汇编代码可以了解函数调用过程中堆栈的结构 :

      

       1 函数调用时 CALL 将下一行指令地址压入堆栈

       2 函数运行第一行会将 EBP 压入堆栈

       3 保存当前堆栈地址到 EBP (mov ebp,esp)

      

       再遇到 call 时从第一步执行,所以每次第二步压入堆栈的都是上一层函数调用的 ESP 地址,而这个地址 +4 字节偏移则是当前调用函数返回后的下一条指令,也就是上一层函数的地址,所以我们只要知道当前函数的 EBP ( 也就是当前函数的栈顶 ) 就能够遍历得到所有调用堆栈层次.

       dumpebp.jpg

我们将windows SEH 结构化异常引入后,可以在异常发生的时候得到当前的EBP值,从而通过这个值得到整个调用堆栈的地址.

 

在发布工程的时候,我们只需要生成map文件,就可以通过这个地址得到崩溃位置.使用HTTP GET 或POST方式可以将我们所需要的崩溃信息提交到我们指定的网站.这种方式只是通过URL参数来提交数据,只需要使用API InternetOpenUrl就可以很方便的将信息提交.此外如果不使用HTTP方式,我们也可以在这个时候创建新的socket 对指定的服务器进行连接来传输数据.

    
    static TCHAR hdrs[] 
= _T("Content-Type: application/x-www-form-urlencoded"); 
    static 
const TCHAR* accept= _T("Accept: */*"); 
        static TCHAR action[]=_T("datecomit.aspx");//预提交的页面
        static TCHAR server[]=_T("192.168.9.119");//提交的server地址

    static TCHAR frmdata[
1024={0}; 
    _tcscpy(frmdata,_T("message=this is a test message");  //提交数据, message为提交名字   
    
    
// for clarity, error-checking has been removed 
    HINTERNET hSession 
= InternetOpen("MyAgent"
    INTERNET_OPEN_TYPE_PRECONFIG, 
NULLNULL0); 
    HINTERNET hConnect 
= InternetConnect(hSession, server
    INTERNET_DEFAULT_HTTP_PORT, 
NULLNULL, INTERNET_SERVICE_HTTP, 01); 
    HINTERNET hRequest 
= HttpOpenRequest(hConnect, "POST", actionNULLNULL&accept, 01); 
    HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata)); 

 

此后我们只需要定期观察所提交的内容,便可以立即得知是否有异常出现.根据同一异常出现的几率可以得知是否是致命的错误,是否需要紧急更新.

 


posted @ 2007-03-27 16:32 修一居士 阅读(5266) | 评论 (7)编辑 收藏

成员函数的调用是编译器内部使用的 __thiscall 即需要this指针,
所以我们调用成员函数必须满足的条件是
1 需要this指针,
2 成员函数有固定的函数地址

先看条件 1  
this指针是在函数调用前用ECX寄存器传入的,
所以我们只需要提前讲this指针赋值给ECX即可

条件2
成员函数是有固定的地址的,也就是说我们可以直接调用,不过大多数情况下因为要访问成员变量,所以如果没有this指针,会在访问时产生异常.对于不需要this指针的成员函数可以正常调用.
如类 CTest

class CTest
{
public :

 CTest() : m_nData (
5 ){}

 
int  GetNum(){reutrn  3 ;]

 
int  GetAmount(){return  2   +  m_nData;}
private :
 
int  m_nData;
};


// 可以这样调用GetNum
return ((CTest
* ) 0 ) -> GetNum();


这两个条件都可以满足,所以代码如下:
typedef int (CTest::*GETAMOUNT)();

void Process(CTest
& t , GETAMOUNT GetAmont)
{
  
int nResult =0;
  __asm{
     mov ecx,[t]      ;传入this指针
     
call GetAmont    ;调用成员函数
     mov nResult, eax ;返回值在EAX中
        }
  cout
<<nResult<<endl;
}

int main(int argc, char* argv[])
{
  CTest test;

  Process(test, 
&CTest::GetAmount);    
  return 
0;
}    
posted @ 2007-03-12 23:05 修一居士 阅读(2310) | 评论 (3)编辑 收藏
IRQ全称为Interrupt Request,即是“中断请求”的意思(以下使用IRQ称呼)。IRQ的作用就是在我们所用的电脑中,执行硬件中断请求的动作,用来停止其相关硬件的工作状态,比如我们在打印一份图片,在打印结束时就需要由系统对打印机提出相应的中断请求,来以此结束这个打印的操作。在每台电脑的系统中,是由一个中断控制器8259或是8259A的芯片(现在此芯片大都集成到其它的芯片内)来控制系统中每个硬件的中断控制。目前共有16组IRQ,去掉其中用来作桥接的一组IRQ,实际上只有15组IRQ可供硬件调用。这16组IRQ的主要用途如下表:

IRQ编号
设备名称
用途

IRQ0
Time
电脑系统计时器

IRQ1
KeyBoard
键盘

IRQ2
Redirect IRQ9
与IRQ9相接,MPU-401 MDI使用该IRQ

IRQ3
COM2
串口设备

IRQ4
COM1
串口设备

IRQ5
LPT2
建议声卡使用该IRQ

IRQ6
FDD
软驱传输控制用

IRQ7
LPT1
打印机传输控制用

IRQ8
CMOS Alert
即时时钟

IRQ9
Redirect IRQ2
与IRQ2相接;可设定给其它硬件使用

IRQ10
Reversed
建议保留给网卡使用该IRQ

IRQ11
Reversed
建议保留给AGP显卡使用

IRQ12
PS/2Mouse
接PS/2鼠标,若无也可设定给其他硬件使用

IRQ13
FPU
协处理器用,例如FPU(浮点运算器)

IRQ14
Primary IDE
主硬盘传输控制用

IRQ15
Secondary Ide
从硬盘传输控制用
posted @ 2007-02-02 22:47 修一居士 阅读(665) | 评论 (0)编辑 收藏
Windbg调试Release版exe .dll .ocx 等 (转)
v0.1 2006-6-1(儿童节)
1.生成符号信息
更改Relase版的设置(2处):
一、Project Setting ->C/C++
Debug info:
选择Program Database
二、Project Setting ->Link
选中Generate debug info
重新编译
2.安装Windbg
下载安装最新的Windbg
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
3.设定环境变量
对于user32.dll等系统文件,Windbg可以自动从微软网站下载所需的符号信息.我们只需设定_NT_SYMBOL_PATH
这个环境变量告诉Winddbg.方法如下:
我的电脑>右键菜单>属性>高级选项卡>环境变量>系统变量>新建
变量名: _NT_SYMBOL_PATH
    变量值:SRV*F:\websymbols*
http://msdl.microsoft.com/download/symbols
解释一下: F:\websymbols用来存储系统符号.你可以指定其他的路径.Windbg会自动创建该文件夹
4.设定符号路径
新建一个文件夹,譬如C:\MyAppSymbols
将第一步中生成的Release目录下<youapp>.pdb文件拷贝到该文件夹,该pdb文件包含了调试所需的符号信息.
打开Windbg,选择File>Symbol file path>将C:\MyAppSymbols路径添加进去
5.调试程序
选择 File > Open Executable 然后选择你需要调试的Exe文件,就可以调试了,其他操作和VC6差不多.

posted @ 2007-02-02 15:47 修一居士 阅读(4797) | 评论 (0)编辑 收藏
仅列出标题
共2页: 1 2 

导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿(3)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜