我正在检查我制作的应用程序的内存使用情况。它多次调用从数据库(SQLite 3)读取和写入值。我观察到以下情况:
QSqlQuery::exec() 使用一些 KB 的 RAM 来执行给定的查询,但在超出范围后不会释放内存。
QSqlDatabase:: open() & close() 不能像文档建议的那样帮助释放资源。如果有的话,close() 会导致资源(至少是内存)“被困”在堆/堆栈上。
例如,这是我用来访问我的数据库的一段典型代码。
QStringList values;
db.open();
QString strQuery = "SELECT DISTINCT " + field + " FROM " + table + str;
QSqlQuery query(db);
query.prepare(strQuery);
if(query.exec() == true)
{
while(query.next())
{
values.push_back(query.value(0).toString());
}
}
db.close();
Run Code Online (Sandbox Code Playgroud)
经过试验,我发现下面的代码“陷阱”了更少的内存:
QStringList values;
QString strQuery = "SELECT DISTINCT " + field + " FROM " + table + str;
QSqlQuery query(strQuery, db);
while(query.next())
{
values.push_back(query.value(0).toString());
}
Run Code Online (Sandbox Code Playgroud)
但是,仍然没有释放少量内存。有没有其他人经历过这样的事情?
我可以一些如何释放这个记忆?
Ps 同样发生在这里,一些内存永远不会被释放:
db.open();
QSqlQuery query(db); …Run Code Online (Sandbox Code Playgroud) 我正在尝试将结构从一个对象传递给另一个对象.我有以下代码:
private void mainMenuStripNewProject_Click(object sender, EventArgs e)
{
frmNewProject frmNewProject = new frmNewProject(this);
if (frmNewProject.ShowDialog() == DialogResult.OK)
{
StructProjectSettings tempProjectSettings = frmNewProject.getSettings();
newProjectEvent(tempProjectSettings); //Fetchs settings from the new project form
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
错误14无法将类型'NathanUpload.frmNewProject.StructProjectSettings'隐式转换为'NathanUpload.Main.StructProjectSettings'o:\ daten\visual studio 2010\Projects\NathanUpload\NathanUpload\Main.cs 43
每个类中的结构都声明为公共类变量,并且是相同的.
我在这里先向您的帮助表示感谢!
我想测试给定的IP和登录详细信息,以查看FTP服务器是否处于活动状态/详细信息是否正确.而已.
我在网上寻找解决方案,但似乎没有简单/雄辩,例如,使用Ping类ping并检查服务器.我有以下,但不起作用:
static private void testConntecion()
{
FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://172.29.200.158/"));
requestDir.Credentials = new NetworkCredential("dvm_user", "dvm");
try
{
FtpWebResponse response = (FtpWebResponse)requestDir.GetResponse();
Console.WriteLine("Cool Beans");
}
catch(Exception ex)
{
Console.WriteLine(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create("ftp://172.29.200.158/");
Run Code Online (Sandbox Code Playgroud)
错误消息:System.Net.WebException:请求的URI对此FTP命令无效.在System.Net.FtpWebRequest.GetResponse()
提前致谢.
从Qt文档:
在调用setRootPath()之前,QFileSystemModel不会获取任何文件或目录.这样可以防止在此之前对文件系统进行任何不必要的查询,例如在Windows上列出驱动器.
与QDirModel(已废弃)不同,QFileSystemModel使用单独的线程来填充自身,因此在查询文件系统时不会导致主线程挂起.对模型填充目录之前,对rowCount()的调用将返回0.QFileSystemModel使用文件信息保留缓存.使用QFileSystemWatcher自动保持缓存是最新的.
我正在使用QTreeView和一个使用可检查框的子类QFileSystemModel.
如果我QFileSystemModel::rowCount(index)在树中展开项目之前调用,我将收到"0",无论是否有任何子目录或文件.但是,一旦扩展,再次调用时将给出正确的行计数.
我想如果你调用QFileSystemModel :: setRootPath(),这将从指定的文件路径中获取数据,但在我调用QFileSystemModel::rowCount下面的代码之前,它似乎没有"足够快地执行"(缓存未更新).
// Whenever a checkbox in the TreeView is clicked
bool MyModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
if (role == Qt::CheckStateRole)
{
if (value == Qt::Checked)
{
setRootPath(this->filePath(index));
checklist.insert(index);
set_children(index);
}
else
{
checklist.remove(index);
unchecklist->insert(index);
}
emit dataChanged(index, index);
return true;
}
return QFileSystemModel::setData(index, value, role);
}
// Counts how many items/children the node has (i.e. file/folders)
void MyModel::set_children(const QModelIndex& index)
{
int row = this->rowCount(index); …Run Code Online (Sandbox Code Playgroud) 我试图了解以下内容(让我们假装MyStorageClass很大):
class MyStorageClass
{
public:
string x;
string y;
string z;
};
class storage
{
public:
storage();
~storage()
{
vector<MyStorageClass *>::iterator it = myVec.begin(); it != myVec.end(); it++)
{
delete *it;
}
vector<MyStorageClass*> getItems()
{
for(int i = 0; i < 10; ++i)
{
v.push_back(new MyStorageClass());
}
return v;
}
private:
vector<MyStorageClass*> v;
};
main()
{
storage s;
vector<MyStorageClass*> vm = s.getItems();
}
Run Code Online (Sandbox Code Playgroud)
从我的描述中,当s返回向量并被赋值给vm它时,作为副本(按值)完成.因此,如果s超出范围并将其称为析构函数,vm则拥有自己的副本,其结构不受影响.但是,通过价值传递效率不高.因此,如果您将其更改为通过引用传递:
vector<MyStorageClass*>& getItems()
{
for(int i = 0; i …Run Code Online (Sandbox Code Playgroud) 我正在创建一个应用程序,它将从SQLite数据库中获取数据并将其显示在表中.
我希望在用户进行选择时(通过多个下拉框)实时更新表格.每次用户从下拉框中选择一个选项时,应用程序都必须创建一个新的SELECT查询,并添加,删除或更改新的WHERE子句.该表将显示查询结果,因为从下拉框中选择了一个项目.
我的问题是,为了使获取过程更快,我是否可以索引每个表中的每个字段?我不确定这是否可行.
我不需要担心INSERT,ALTER等性能问题,因为很少会添加新数据.
谢谢
我在表单上单击按钮时有以下代码:
private void btnOK_Click(object sender, EventArgs e)
{
if (this.txtProjectName.Text == "")
{
MessageBox.Show("No project name entered", "No Project Name", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
btnOK.DialogResult = DialogResult.None;
}
else
{
this.btnOK.DialogResult = DialogResult.OK;
return;
}
}
Run Code Online (Sandbox Code Playgroud)
如果文本框中有内容,则表单仅在第二次单击时关闭.有没有办法立即关闭表单,并将DialogResult.OK传递给它的调用者?
谢谢
我有以下非常简单的代码:
main.cpp中
#include "ui_library_browser.h"
#include <QtGui/QApplication>
#include "StartWindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
StartWindow w;
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
StartWindow.h
#ifndef STARTWINDOW_H_
#define STARTWINDOW_H_
#include <qwidget>
#include "MainWindow.h"
class StartWindow : public QWidget
{
Q_OBJECT
public:
StartWindow();
~StartWindow();
MainWindow main_window; //<-- Problem
};
#endif
Run Code Online (Sandbox Code Playgroud)
MainWindow.h
#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_
#include <qdialog.h>
#include "StartWindow.h"
class MainWindow : public QDialog
{
Q_OBJECT
public:
MainWindow();
~MainWindow();
};
#endif
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
moc_MainWindow.cpp
StartWindow.h(14):错误C2146:语法错误:缺少';' 在标识符'main_window'StartWindow.h(14)之前:错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int StartWindow.h(14):错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
我以前写过一些C++/Qt应用程序,但我对此感到很满意!
提前致谢!
我正在尝试从计算机的内存中提取double的字节值.其原因是准确性,因为表示给用户的最终值具有一些舍入.
理想情况下,我希望能够从数字(IEEE 754标准)中提取符号,指数和尾数
根据我的理解,转换为无符号字符是可行的方法.我有以下代码片段(在其他地方被盗),但我不相信结果 - 任何整数值都没有字节输出:
double d = 2;
unsigned char *p = (unsigned char*)&d;
Run Code Online (Sandbox Code Playgroud)
任何人都可以指导我正确的方向,以准确提取双数字的字节表示,或提供有关如何进行的任何建议/意见?
我有以下课程.在Main类中的for循环期间发生错误.编译器抱怨draw函数"是非类型GLCommand".应用程序的想法是存储许多不同类型的GLCommand和Shape相同的载体中.我应该采用不同的设计方法,还是简单解决这个问题?
接口:
class GLCommand
{
public:
GLCommand();
virtual ~GLCommand();
virtual void draw() = 0;
};
Run Code Online (Sandbox Code Playgroud)
抽象类:
class Shape : public GLCommand
{
public:
Shape(int);
virtual ~Shape();
virtual void draw() {};
private:
double colour[];
int sides;
};
Run Code Online (Sandbox Code Playgroud)
派生类:
class Polygon : public Shape
{
public:
Polygon(int sides);
virtual ~Polygon();
void draw();
private:
vector<Coordinates *> verticies;
};
Run Code Online (Sandbox Code Playgroud)
主要:
int main()
{
vector <GLCommand*> vec;
Polygon p(4);
vec.push_back(&p);
for (vector<GLCommand*>::iterator it = vec.begin(); it!=vec.end(); ++it) …Run Code Online (Sandbox Code Playgroud)