我们在每台开发PC上都有大量的Qt拷贝 - 每个项目在第三方目录中都有自己的Qt拷贝.这是因为每个项目都是用自己的Qt开发和测试的; 一个常见的情况是,我们需要为某个项目定制Qt版本.因此,由于上面提到,我们有一个单独的SVN repo,用于在每个Qt项目中保存各种Qt构建和外部,它们指的是这些构建中的一个.
问题是,当使用CMake时,我们只能选择Qt的版本,而Qt4 finder决定自己使用什么Qt.那不是正确的.我们需要重定向finder以配置项目第三方目录中特定Qt副本的所有内容.
我试图指定类似的PATHS选项FIND_PACKAGE:FIND_PACKAGE( Qt4 REQUIRED PATHS "thirdparty/Qt" )但这没有帮助.我试图设置QT_QMAKE_EXECUTABLE变量,但这不起作用.我已经尝试在安装之前将PATM变量所需的QMake路径(它由FindQt4.cmake用来确定所有目录)添加到PATH变量中,但这也没有帮助.
有没有办法使用FIND_PACKAGE提供的所有东西但是对于某个Qt拷贝?我真的不想实现所有Qt包装器,手动设置所有定义,包括,dirs等.
这是我的CMake项目.也许这会有所帮助:
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
#############################################################################
MACRO( ADD_FILES_TO_FILTER rootFilterName rootFilterPath files )
FOREACH( curFile ${files} )
FILE( RELATIVE_PATH curFilter "${CMAKE_CURRENT_SOURCE_DIR}/${rootFilterPath}" "${CMAKE_CURRENT_SOURCE_DIR}/${curFile}" )
FILE( RELATIVE_PATH test "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/${curFile}" )
GET_FILENAME_COMPONENT( curFilter ${curFilter} PATH )
SET( curFilter "${rootFilterName}/${curFilter}" )
STRING( REPLACE "/" "\\\\" curFilter ${curFilter} )
SOURCE_GROUP( ${curFilter} FILES ${curFile} )
ENDFOREACH( curFile )
ENDMACRO( ADD_FILES_TO_FILTER rootFilterName rootFilterPath files ) …Run Code Online (Sandbox Code Playgroud) 在我们的项目中,我们使用QtTestLib进行单元测试.原因是整个项目在可能的情况下已经使用Qt并且它是一个GUI应用程序,因此我们希望能够测试GUI界面.
我们的项目是由MSVC编译的,所以我们不希望每个测试都有一个单独的项目文件,因为它会使解决方案变得混乱.因此,我们为所有测试创建了一个项目.所有测试都应该在CIS上自动进行(持续集成),因此我们尝试使用一些XSLT转换通过XML格式的输出文件将测试插入Hudson.
但似乎测试输出存在问题.如果对所有测试使用单个main(),并且仅向每个测试传输cmd行参数:
#include "MyFirstTest.h"
#include "MySecondTest.h"
int main(int argc, char **argv)
{
int result = 0;
MyFirstTest test1;
result |= QTest::qExec(&test1, argc, argv);
MySecondTest test2;
result |= QTest::qExec(&test2, argc, argv);
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后你会得到一个多次重写的结果文件.因此,如果您想使用输出文件(例如xml)稍微自动化它,您将只获得其中的最后结果.所有其他都将被覆盖.
我们已经尝试过这种方法,它不能让你使用像Hudson这样的连续集成系统.所以我的问题是:有没有机会在一个输出文件中附加结果?当然,我们可以使用一些解决方法,例如通过QTest :: qExec()运行每个测试,并使用修改后的参数将结果写入单独的文件,但这似乎不是最好的方法.理想情况下,我希望有一个结果文件与CIS一起使用.
我想实现在C多线程LRU缓存++使用此文章的提示或灵感。它适用于 Go,但所需的概念或多或少也存在于 C++ 中。本文建议在散列表和链表周围使用带有共享互斥锁的细粒度锁定。
因此,我打算使用 编写缓存std::unordered_map,std::list并使用std::shared_timed_mutex. 我的用例包括几个线程 (4-8) 使用此缓存作为拼写错误的单词和相应可能的更正的存储。缓存的大小约为 10000-100000 个项目。
但是我在几个地方读到,使用共享互斥锁而不是普通互斥锁几乎没有意义,而且速度更慢,尽管我找不到一些带有数字的真实基准或至少在何时使用和何时不使用的模糊指南共享互斥锁。而其他来源建议在您有并发读取器或多或少超过并发写入器时使用共享互斥锁。
std::shared_timed_mutex比使用一个普通的更好std::mutex?读者/阅读人数应该多于作者/写作人数多少次?我当然知道这取决于很多因素,但是我应该如何决定使用哪个?std::shared_mutex(从C ++ 17)做比较,定时一个在性能上有什么区别?PS我觉得会有“首先测量/描述最适合你的情况”。我会,但我需要先实现一个,如果有一些启发式可供选择,而不是同时实现选项和测量,那就太好了。此外,即使我进行测量,我认为结果也将取决于我使用的数据。并且很难预测真实数据(例如对于云中的服务器)。
我们需要计算一个 mp3 文件的哈希值来唯一标识它。问题是 Traktor 软件会修改文件的标签,并且没有机会更改它。
我们使用 id3lib 库,所以我想也许有某种方法可以获得各种版本的标签的前置和附加大小,并且只读取它们之间的媒体内容来计算它的哈希值。我一直在 id3lib 文档中搜索,我发现的唯一内容是ID3_Tag::GetPrependedBytes()and ID3_Tag::GetAppendedBytes(),就像这样:
const std::size_t prepend = tagOpener.GetPrependedBytes();
const std::size_t append = tagOpener.GetAppendedBytes();
const std::size_t overall = tagOpener.Size();
Run Code Online (Sandbox Code Playgroud)
但他们只返回 0。
如果这有帮助,我们正在用 C++ 和 Qt 一起开发,所以也许有一些东西可以帮助解决这个问题。
我需要它使用GDI函数处理RGB24数据(特别是StretchBlt()非常快)我不能使用CreateCompatibleDC(),因为它只能用其他DC的颜色深度创建内存DC.通常它用于屏幕DC(通过传输NULL指针到功能),通常屏幕的颜色深度为32.此外我不能依赖它,'因为如果屏幕设置被更改,我的应用程序可能无法正常工作.
所以我需要一些方法来创建具有特定特定颜色深度的内存DC.到目前为止,我发现使用CreateDC()函数只有一种方法,但它需要许多特定于设备的参数,对我来说似乎有点不可靠.此外,有太多的字段需要填充适当的值来调用CreateDC().
是否有一些更简单的方法来创建特定的内存DC而不依赖于某些设备?或者即使创建24 bpp的内存DC?
PS我需要一些快速的图形.我已经尝试手动将alpha通道添加到位图以使用它兼容屏幕32bpp内存DC并且它已经解决了,但是太慢了.正如我上面所说,我不能依赖可以更改的屏幕设置.