随笔 - 1, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……
re: 无锁线程通信(1) 爱饭盒 2010-05-06 11:27
不是低效的问题,是仅一个标识位不能做到同步,要做到同步,需要指令支持检查置位做为一个原子操作。好像有cpu支持的。比如checkAndSet(flag)调用做为一个原子操作。否则就存在如下乱序。
if(A.check_flag() == 1 )
{
//线程A被挂起。
//线程B:if(B.check_flag() == 1) 此时也是为真,B.set_flag(0); 消耗掉资源,resource--;
//线程A被唤醒,
//线程A:A.set_flag(0);消耗资源. resource--;此时资源其实已经被消耗过了,A仍然可以去消耗。
//B.set_flag(1);
}
re: 非MFC DLL 爱饭盒 2008-09-17 00:15
存在继承时:

#ifdef __DLL_BUILD
class _declspec(dllexport) CA;
#else
class _declspec(dllimport) CA;
#endif
class CA
{
public:
CA();
};

#ifdef __DLL_BUILD
class _declspec(dllexport) CB;
#else
class _declspec(dllimport) CB;
#endif
class CB:public CA
{
public:
CB();
};

re: 什么代码才是线程安全的 爱饭盒 2008-02-25 18:03
呵呵,刚才代码贴的不对,多线程的没贴出来,在多线程时能体现出来这点,单线程体现不出来.
re: 什么代码才是线程安全的 爱饭盒 2008-02-25 17:51
这里对同时进入一段代码使用sleep()进行放大处理,实际应用时,单单一个++m,也可能会同时多个线程访问.只是++m不太好测试.
re: 什么代码才是线程安全的 爱饭盒 2008-02-25 17:45
MyClass() : m(0)
{
++m;
}
问题出在这里;

上面又说:
++这个操作其实分为两部,一个是读,另外一个是写
mov ecx,global
add ecx,1
mov global,ecx
当为多线程时,MyClass构造函数可能会被调用多次:举个例子


class MyClass2
{
public:
MyClass2()
{
m++;
//如果去掉sleep,则第二次调用函数func()时不会再进入构造函数,所以要线程安全,要防止代码同时进入这里.
sleep(10);
cout<<"MyClass2:"<<m<<endl;
}
int m;
void func(){ cout<< "func:"<<m<<endl;}
};
void func()
{
static MyClass2 o2;
o2.func();
}
int main()
{
func();
cout<<"################"<<endl;
func();
return 0;
}
re: 调用存储过程 爱饭盒 2006-11-09 16:24
关于ADO调用存储过程的 方法在很多书中都有讲到,标准的做法无非是按照以下步骤进行: 1、生成并初始化一个_CommandPtr对象; 2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象; 3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数 和输出参数); 4、为_CommandPtr对象指定需要使用的ADO连接; 5、使用_CommandPtr的Execute方法调用存储过程; 6、从结果中获取返回参数的值(如果有的话)。
具体的过程在此我不详细描述,我想看看本文附带的代码就应该很明白了。
在这里我想就我使用ADO调用存储过程时的一些体会说明一下。
1、关于CreateParameter函数
该函数的原型为:CreateParameter (Name, Type, Direction, Size, Value)
其中Name是参数的名称,可以指定也可以不指定; Type是一个DataTypeEnum值,指定参数的类别,取值有adInteger(整型)、adChar(字符/字符串型)等; Direction是一个ParameterDirectionEnum值,其取值为adParamInput、adParamInputOutput、 adParamOutput、adParamReturnValue、adParamUnknown; Size是一个Long类型的值,指示该参数值以字节计算的最大长度,例如对int型,该值可以取为sizeof(int), 对Long型,该值可以取为sizeof(long),对字符串型,可以使用该字符串的长度; Value是一个variant类型的值,是该参数的取值。
在这里需要注意的是,Type参数、Direction参数以及Size参数一定要和存储过程定义时的参数相吻合,
例如,如果有下面一个存储过程 CREATE PROCEDURE SMS_Proc_Handle_All (@UserID Integer, @SourAddr Varchar(15), @DestAddr varchar(5000), @AvValue Single output, @ReturnInfo varchar(100) output ) 则Type参数的取值依次为adInteger、adChar、adChar、adSingle,adChar; Direction参数的取值依次为adParameterIn、adParameterIn、adParameterIn、adParameterOut、adParameterOut; 对于输入参数,Size的值可以根据实际数值来定,对于输出参数,最好是根据定义确定(上例中ReturnInfo参数的 Size值可以取为100)。
2,关于获取Output的参数
获取ourput参数是大家最关注的问题,同时也是最“难”的问题,因为按照书本上的写法,经常获得不了 Output参数,其实这个问题很容易解决:在调用_CommandPtr的Execute方法时,写成 cmmd->Execute(NULL, NULL, adCmdStoredProc); 而不要写成 RecordsetPtr rec = cmmd->Execute(NULL, NULL, adCmdStoredProc); 也就是说,不取返回值(我不知道这是为什么,但是相信我,事情就是这样)。 这句执行完后,使用 cmmd->Parameters->GetItem("XXXXXX")->GetValue(); ^^^^^^^ 输出参数的名称 就可以获得输出参数的值了。
以下是一个通过ADO调用存储过程的部分代码:
_CommandPtr cmmd; HRESULT hr = cmmd.CreateInstance(__uuidof(Command)); if(FAILED(hr)) { AfxMessageBox("NewNetDatabase()中创建_CommandPtr对象失败"); return 0; } _ParameterPtr param; param = cmmd->CreateParameter(""/*NetType*/,adTinyInt, adParamInput, sizeof(BYTE),(BYTE)(m_nNetType+1)); cmmd->Parameters->Append

re: STL 学习笔记 三 小试牛刀 爱饭盒 2006-11-01 09:57
对啊
re: 创业这两年的郁闷 爱饭盒 2006-10-13 20:52
兄弟自己能创业说明还是有一定实力的,创业的路不好走,不过别泄气啊,看准路子继续走下去。支持中!
re: CArchive原理 爱饭盒 2006-09-14 15:18
好东东
re: windows网络编程九 爱饭盒 2006-09-07 22:04
测试
re: 一个DES算法 爱饭盒 2006-07-07 16:48
你最好再找下,我不记得原作者了,很抱歉
re: 一个DES算法 爱饭盒 2006-07-05 09:56
抱歉,这个是我在网上找来的,版权不归我的,放在这是为学习参考的,如需请联系原作者
re: ado 出错处理 爱饭盒 2006-06-30 11:25
大部分的ADO的错误码对应的含义
( http://www.zhujiangroad.com )

除了在 Error 对象和 Errors 集合中说明的提供者错误之外,ADO 本身也将错误返回到运行时环境的异常处理机制之中。使用编程语言的错误捕获机制(如 Microsoft® Visual Basic® 中的 On Error 语句)可捕获及处理下列错误。下表将同时显示十进制和十六进制错误代码值。

常量名称 编号 说明

adErrInvalidArgument 3001
0x800A0BB9
应用程序使用的参数其类型错误、超出可接受的范围或者与其他参数冲突。

adErrNoCurrentRecord 3021
0x800A0BCD
BOF 或 EOF 为 True,或者当前记录已经删除。应用程序请求的操作需要当前记录。

adErrIllegalOperation 3219
0x800A0C93
应用程序请求的操作不允许出现在该上下文中

adErrInTransaction 3246
0x800A0CAE
在事务中应用程序无法显式关闭 Connection 对象。

adErrFeatureNotAvailable 3251
0x800A0CB3
提供者不支持应用程序请求的操作。

adErrItemNotFound 3265
0x800A0CC1
ADO 无法在对应于应用程序请求的名称或顺序引用的集合中找到对象。

adErrObjectInCollection 3367
0x800A0D27
无法追加,对象已经在集合中。

adErrObjectNotSet 3420 0x800A0D5C 应用程序引用的对象不再指向有效的对象。
adErrDataConversion 3421
0x800A0D5D
应用程序使用了不符合对当前操作的值类型。

adErrObjectClosed 3704
0x800A0E78
如果对象关闭,则不允许应用程序请求的操作。

adErrObjectOpen 3705
0x800A0E79
如果对象打开,则不允许应用程序请求的操作。

adErrProviderNotFound 3706
0x800A0E7A
ADO 找不到指定的提供者。

adErrBoundToCommand 3707
0x800A0E7B
应用程序无法用 Command 对象将 Recordset 对象的 ActiveConnection 属性更改为它的来源数据。

adErrInvalidParamInfo 3708
0x800A0E7C
应用程序错误地定义了 Parameter 对象。

adErrInvalidConnection 3709
0x800A0E7D
应用程序通过引用关闭或无效的 Connection 对象来请求对对象的操作。
哥们,不好意思是转载的
re: 呵呵!开业大吉!!! 爱饭盒 2005-09-28 15:10
呵呵,谢谢!!