以下皆是个人工作当中的一得之见,或有谬误,贻笑大方,诸君见谅!
未明确的符号
这是由于不同的第三方库中定义了相同的符号,可能是函数,也可能始数据类型,这种情况下,最好是能够确认是由哪两个或多个库冲突,确认之后,修改函数或者数据类型名称,一般而言,如果是数据类型名称冲突,比较容易解决,由于库已生成,不需要重新编译,所以我们只需要修改头文件中的数据类型名称即可,如果是函数类型,那么由于涉及到库的链接问题,那么只能修改函数名后重新编译;
lambda静态函数的误区
void RaiseTask( )
{
QtTask* progress = new QtTask(this);
progress->Update(0);
progress->Update(tr("Serach the the image and it's points..."));
static auto Done = [&](const QString& str){
progress->Done(QString(""));
progress.clear();
Msg(str);
};
}
上述这段代码看似没有问题,但是实际上,潜藏了一个重入性的问题:第一次函数运行时并没有问题,但是因为lambda声明为static,所以第二次进入时其捕获的QtTask的指针仍然是第一次进入时创建的,但第一次的指针指向的空间已析构,那么崩溃就变的不可避免;
关于clear函数
clear()函数只是将容器中数据清空,但是需要考虑一种情况:当数据量较大时,clear()也将变的耗时;根据实际测试,当map函数中数据达到一千万时,清空数据需要2s,所以要慎用clear,但是对于客户端来说,两秒的阻塞已经有明显的卡顿,所以可以使用线程操作;
代码没问题,但是程序为什么会崩溃
很多时候线程运行时,操作界面,程序莫名其妙的崩溃了,但是查了一下代码,并没有问题,于是再运行,这个时候操作又不会崩溃了,到底是什么原因会导致这种情况呢?个人认为是由于线程运行,占用电脑cpu,如果此时进行额外操作,比如操作界面,那么主线程必然会争夺cpu的使用权,电脑性能好,当然没有问题,但是如果电脑垃圾呢?这个时候可能就难以避免崩溃,解决方式是在线程中增加sleep,因为所谓线程,不过是宏观下的并行,微观下仍然是根据时间片分配轮流执行的,当线程sleep时,cpu得以喘息,外在表现就是电脑没那么卡了,因为这个时候其他操作也有执行机会,但是不得不考虑效率问题,线程中我们执行的大多都是耗时操作,比如1000万次循环,如果每次sleep 0.1ms,那么也将延迟100s,对于速度而言,是一个严重的牺牲;