上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 23 下一页
摘要: 对于大多数mfc对象,请不要在线程间传递它们,不管是栈上的还是堆上的!原因如下: 1、 mfc的大多数类不是线程安全的,调用传入对象的成员函数可能不会报错,但是未必能达到程序预定的功能! 2、 mfc与界面有关的类,其大多数成员方法都是通过sendmessage实现的,如果消息处理函数本身不是线程安全的,你从工作线程中调用这些方法迟早会同你界面线程的用户消息响应发生冲突; 3、对于CWnd相关的类,即使传入窗口句柄,有时操作也会引起异常(ASSERT异常):通过句柄获取窗口对象并且调用其成员函数或者成员变量!因为该对象是临时对象,访问其成员变量没有意义,访问其成员函数可能会抛出异常! 不能在线 阅读全文
posted @ 2012-12-12 20:54 任智康 阅读(5235) 评论(0) 推荐(1) 编辑
摘要: MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员,可以这样实现:1)全局函数。如 UINT MyThread(LPVOID p)2)类的静态成员函数。如 static UINT MyView::MyThread(LPVOID p) 线程函数是可以带参数的,比如static__stdcallworkthread(LPVOIDlpParam)你可以在创建这个线程的时候,把对象指针传递到lpParam,然后使用这个指针就可以在线程函数里调用非静态成员变量... 阅读全文
posted @ 2012-12-12 11:51 任智康 阅读(15951) 评论(2) 推荐(1) 编辑
摘要: 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:int (*f)(int x);double (*ptr)(double x);在定义函数指针时请注意: 函数指针和它指向的函数的参数个数和类型都应该是—致的; 函数指针的... 阅读全文
posted @ 2012-12-04 19:53 任智康 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。 在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便允许同一个名字(具有不同的参数类型或者是不同的作用域)有多个用法,而不会打破现有的基于C的链接器。这项技术通常被称为名称改编(Name Mangling)或者名称修饰(Name Decoration)。许多C++编译器厂商选择了自己的名称修饰方案。 因此,为了使其它语言编写的... 阅读全文
posted @ 2012-12-03 16:46 任智康 阅读(897) 评论(0) 推荐(0) 编辑
摘要: Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义。谨记:声明可以多次,定义只能一次。函数的声明extern关键词是可有可无的,因为函数本身不加修饰的话就是extern的。但是引用的时候一样是需要声明的。而全局变量在外部使用声明时(注意只有全局变量才能在外部使用),extern关键词是必须的,如果变量无extern修饰且没有显式的初始化,同样成为变量的定义,因此此时必须加extern,而编译器在此标记存储空间在执行时加载如内存并初始化为0。而局部变量的声明不能有extern的修饰,且局部变量在运行时才在堆栈部分分配内存。全局变量或函数本质上讲没有区别,函数名是指向函数二进制块开 阅读全文
posted @ 2012-11-30 21:05 任智康 阅读(11915) 评论(0) 推荐(0) 编辑
摘要: 结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针。结构体的相互引用(mutual reference),就是说在多个结构体中,都包含指向其他结构体的指针。1. 自引用结构体1.1 不使用typedef时错误的方式:struct tag_1{ struct tag_1 A; int value;};这种声明是错误的,因为这种声明实际上是一个无限循环,成员A是一个结构体,A的内部还会有成员是结构体,依次下去,无线循环。在分配内存的时候,由于无限嵌套,也无法确定这个结构体的长度,所以这种方式是非法的。正确的方式:(使用指针)struct ... 阅读全文
posted @ 2012-11-30 20:57 任智康 阅读(32572) 评论(0) 推荐(6) 编辑
摘要: 问题一:下面声明了什么! String s = "Hello world!"; 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。 这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语 阅读全文
posted @ 2012-11-27 21:04 任智康 阅读(1781) 评论(0) 推荐(0) 编辑
摘要: 1、Windows API现在windows.h头文件中申明。其函数的实现,由操作系统提供的。 Win32 Console Application只能运行命令行程序 入口点: 一个是main Win32 Application是基于消息响应机制的,可以运行图形化的C++程序 入口点: 一个是Winmain Win 32程序编写步骤: (1)、WinMain函数的定义 (2)、创建一个窗口 (3)、进行消息的循环 (4)、编写窗口过程函数2、Windows程序中,有各种各样的资源(窗口、图标、光标),系统在创建这些资源的时候会为他们分配内存,并返回标识这些资源的标识... 阅读全文
posted @ 2012-11-27 20:59 任智康 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 1、sleep()和wait() wait()放弃对象锁,只有对此对象发出notify()方法,才能使其进入线程池。2、final、fially、finalize的区别3、&:是位操作符。 &&:是逻辑操作符4、多态性:允许不同的类的对象对同一消息作出响应。包括参数多态性和包含多态性。5、int是原始数据类型,Integer是引用类型,Java为int提供的封装类型。6、同步:数据在线程间共享,进行同步存取。例如:正在写的数据有可能被另一个线程读取。 异步:应用程序在对象上调用了一个花很长时间来执行的方法,且不希望让程序等待该方法返回。7、堆(heap)和栈(stack 阅读全文
posted @ 2012-11-26 21:14 任智康 阅读(260) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#define NUM 6int main(){ void print_msg(char*); print_msg("hello,"); print_msg("world!");}void print_msg(char* m){ int i; for(i=0;i<NUM;i++) { printf("%s",m); fflush(stdout); sleep(1); }}下图反映了程序的执行流程:执行结果:hello,hello,hello,hello,hello,hello,wor 阅读全文
posted @ 2012-11-26 15:24 任智康 阅读(16638) 评论(1) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 23 下一页