我有一个小但很痒的问题.如何在Qt中获取Windows路径的正确案例?
假设我有一条c:\documents and settings\wolfgang\documents存储在a中的路径QString str,我想知道正确的情况,这里C:\Document and Settings\Wolfgang\Documents.QDir(str).absolutePath()没有让我通过正确的案例.
任何建议,因为我不知道我还能尝试什么?
感谢您的时间!
有时候,从C或C++等高级语言中理解反汇编是有用的.阅读有关汇编的书籍显然是理解编译器输出的必要部分,但根据我的经验,从头开始编写汇编代码与阅读和理解编译器生成的操作码完全不同.我在汇编时所知道的书籍并没有很好地涵盖那部分,我相信如果你曾经接触过汇编,那么主要是通过尝试理解编译器输出.
您是否了解如何解释编译器输出的深入教程(或书籍)?
我的想法是介绍常见的高级语言习语,以及它们如何通过常见的编译器(msvc和gcc)转换为汇编.
我正在使用C++实现的一个不那么小的树结构(它是一个Burkhard-Keller-Tree,内存> 100 MB).指向每个节点的子节点的指针存储在QHash中.
每个节点x有n个子节点y [1] ... y [n],子节点的边缘用编辑距离d(x,y [i])标记,所以使用散列来存储节点是显而易见的解.
class Node {
int value;
QHash<int, Node*> children;
/* ... */
};
Run Code Online (Sandbox Code Playgroud)
我还想将它序列化并反序列化为一个文件(我目前使用的是QDataStream).该树只构建一次,然后不会改变.
构建树并对其进行反序列化相当慢.我以明显的方式加载树:递归构建每个节点.我认为这是次优的,因为与new运营商分开创建了许多节点.我读到的地方new很慢.初始构建不是一个大问题,因为树相当稳定,不必经常重建.但是从文件加载树应该尽可能快.
实现这一目标的最佳方法是什么?
将整个树保存在具有相邻节点的单个内存块中一定要好得多.然后将序列化和反序列化减少以保存和加载整个块,我必须只分配一次.
但要实现这一点,我将不得不重新实施QHash,AFAIK.
你会怎么做才能加速反序列化?
附录
感谢您建议进行一些分析.结果如下:
从文件重建树时
1 % of the time is consumed by my own new calls
65 % is consumed by loading the QHash objects (this is implemented by the
Qt Library) of each node
12 % is consumed by inserting the nodes into the existing tree
20 % is …Run Code Online (Sandbox Code Playgroud) 当我运行我在四核Intel上编写的单线程程序时,我可以在Windows任务管理器中看到,我CPU的所有四个内核实际上都或多或少都处于活动状态.一个核心比其他核心更活跃,但也有活动.没有其他程序(当然除了OS内核)运行,这对于该活动来说是合理的.当我关闭我的程序所有活动时,所有核心都下降到接近零.剩下的就是核心上的一点"噪音",所以我很确定所有可见的活动直接或间接地来自我的程序(如调用系统例程).
操作系统或内核本身是否可能尝试在所有四个内核上平衡某些代码或执行,即使它不是多线程程序?你有任何记录这种技术的链接吗?
该程序的一些信息:它是一个用Qt编写的控制台应用程序,任务管理器声明只有一个线程正在运行.也许Qt使用线程,但我不使用信号或插槽,也不使用任何GUI.
链接到任务管理器截图:http://img97.imageshack.us/img97/6403/taskmanager.png
这个问题与语言无关,与Qt/C++无关,我只想知道Windows或Intel是否还要在所有内核上平衡单线程代码.如果他们这样做,这项技术如何运作?
我能想到的是,在所有内核上都安排了从磁盘读取等内核例程,但这不会显着提高性能,因为代码仍然需要与内核api调用同步运行.
编辑
您是否知道任何工具可以比较差的Windows任务管理器更好地分析单线程和/或多线程程序?
编译此代码
int main(int argc, char **argv)
{
int xor = 0;
}
Run Code Online (Sandbox Code Playgroud)
通过
g++ main.cpp
Run Code Online (Sandbox Code Playgroud)
结果是:
internal compiler error: Segmentation fault
Run Code Online (Sandbox Code Playgroud)
同
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659).
Run Code Online (Sandbox Code Playgroud)
重命名变量将删除错误.
问题:来自Apple废话的gcc是什么?
到目前为止,当我按下F11时,我的Visual Studio 2008调试器优雅地进入了Qt库代码.将Qt升级到最新版本并更改QTDIR后,F11不再进入库代码.任何线索如何使调试器再次智能化?
你怎么看?这是正确的还是有内存泄漏?
资源:
#include <QList.h>
#include <boost/shared_ptr.hpp>
#include <iostream>
class A {
private:
int m_data;
public:
A(int value=0) { m_data = value; }
~A() { std::cout << "destroying A(" << m_data << ")" << std::endl; }
operator int() const { return m_data; }
};
int _tmain(int argc, _TCHAR* argv[])
{
QList<boost::shared_ptr<A> > list;
list.append(boost::shared_ptr<A>(new A(6)));
std::cout << int(*(list.at(0))) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
6
destroying A(6)
Run Code Online (Sandbox Code Playgroud) 我正在使用之前从另一个数据库中选择的~11.000.000行填充PostgreSQL表.我正在使用Python和psycopg2.整个过程大约需要1.5小时才能完成.但是,大约30分钟后我得到"连接意外关闭"异常.源代码如下所示:
incursor = indb.cursor()
incursor.execute("SELECT ...")
indb.commit() # (1) close transaction
outcursor = outdb.cursor()
rows = 0
for (col1, col2, col3) in incursor: # incursor contains ~11.000.000 rows
outcursor.execute("INSERT ...", (col1, col2, col3)) # This fails after ~30 minutes
row += 1
if row % 100 == 0: # (2) Write data every 100 rows
outcursor.close()
outdb.commit()
outcursor = outdb.cursor()
incursor.close()
outcursor.close()
outdb.commit()
Run Code Online (Sandbox Code Playgroud)
我插入(1)并(2)在第一次尝试失败后,假设打开的事务具有约30分钟的上限时间或者游标具有挂起插入的上限.似乎这些假设都不是真的,错误就在其他地方.
两个数据库都存储在VirtualBox机器上,我通过端口转发从主机连接.我在主机上运行程序.
这两个数据库仅用于测试目的,并且没有其他管理连接.也许我必须重写问题来解决这个问题,但我需要在其他地方非常耗时的插入(运行大约几天)所以我非常担心psycopg2PostgreSQL中的一些隐藏时间限制.
我想在委托中绘制一个QComboBox,除了我无法弄清楚如何绘制在组合框中可见的初始文本之外,它工作得很好.
文档说QStyleOptionComboBox.currentText保持:"组合框当前项的文本." 但设置变量没有任何影响.
这是我的代码:
void MyDelegate::paint(QPainter *painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
QStyleOptionComboBox comboBoxOption;
comboBoxOption.rect = option.rect;
comboBoxOption.state = option.state;
comboBoxOption.state |= QStyle::State_Enabled;
comboBoxOption.editable = false;
comboBoxOption.currentText = "CCC"; // This doesn't show up.
QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &comboBoxOption, painter);
}
Run Code Online (Sandbox Code Playgroud)
看着qwindowsxpstyle.cpp我没有看到"真实"组合框的文本在哪里被绘制,因为currentText在drawComplexControl方法中没有使用.它似乎用于Windows XP风格的唯一地方是qcommonstyle.cpp(Line 2107,Qt 4.7.2),但我无法弄清楚这两个类如何一起玩.
我想在项目中使用boost :: thread,并且将CMake用作构建工具。但是,即使是非常简单的设置也会导致两个编译器错误:
main.cpp
#include <boost/thread.hpp>
int main()
{
boost::thread t;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project (ThreadTest)
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.58.0 COMPONENTS random thread)
set(SOURCE_DIR src)
set(SOURCE_FILES
${SOURCE_DIR}/main.cpp
)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(test ${SOURCE_FILES})
target_link_libraries(test ${Boost_LIBRARIES})
endif()
Run Code Online (Sandbox Code Playgroud)
我正在使用Boost 1.68.0,CMake可以找到它,并且能够构建正确的Visual Studio项目文件。
我尝试使用boost :: random,它起作用了。
但是,编译上面的程序会导致两个错误消息:
这是error_code.hpp中的引发错误的行
我在boost安装中寻找了文件'libboost_thread-vc14 1 -mt-x64-1_68.lib',但仅找到'boost_1_68_0 \ lib64-msvc-14.0 \ boost_thread-vc14 0 -mt-gd-x64-1_68.lib'
链接器设置包含正确的文件:
所以,我有两个问题:
我们都知道通常使用模板来设计容器,我们都知道你可以使用模板来做你的头脑.
当我第一次尝试静态多态时,我真的很惊讶你可以用模板做什么.很明显,模板比设计容器更有用.我买了安德烈的"现代C +设计",但遗憾的是还没有找到时间或专注于阅读它,但我确信它提供了丰富的模板使用.
恕我直言这也是一个非常聪明的模板使用.
您遇到的模板最巧妙的用途是什么?
我在QAbstractTableModel的派生中使用了一个相当复杂的QList来存储数据:
class MyTableModel : public QAbstractTableModel {
Q_OBJECT
QList<QHash<int, QHash<int, QVariant> *> *> m_data;
/*...*/
};
MyTableModel::~TMusicTableModel() {
/* Should I deallocate QList items? */
}
MyTableModel::setData(int row, int col, int type, QVariant value) {
/* inserting a new data field */
QHash<int, QHash<int, QVariant> *> *row_hash = new QHash<int, QHash<int, QVariant> *>();
QHash<int, QVariant> *role_hash = new QHash<int, QVariant>();
type_hash->insert(type, value);
row_hash->insert(col, type_hash);
m_data.insert(row, row_hash);
return true;
}
Run Code Online (Sandbox Code Playgroud)
我想知道QList和QHashes是否负责处理,或者我是否应该这样做.在这种情况下,文档的信息量不大.
我想用 Keras 创建一个带有两个 LSTM 层的模型。但是,以下代码会生成错误:
from keras.models import Sequential
from keras.layers import LSTM, Dropout, Activation
from keras.callbacks import ModelCheckpoint
from keras.utils import to_categorical
model = Sequential()
model.add(LSTM(5, activation="softmax"))
model.add(LSTM(5, activation="softmax"))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['categorical_accuracy'])
# These values are to be predicted.
directions = [-2, -1, 0, 1, 2]
# Sample data. We have three time steps, one
# feature per timestep, and one resulting value.
data = [[[[1], [2], [3]], -1],
[[[3], [2], [1]], 2],
[[[4], [5], [7]], 1],
[[[1], [-1], …Run Code Online (Sandbox Code Playgroud)