- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
感谢您阅读本文。
我正在编写一个程序,用于在 QTableWidget 中查看 Linux 上正在运行的进程。
我正在使用QThread来更新QTableWidget,并且我已经使用QLineEdit添加了过滤,到目前为止一切正常。
现在,我已经通过单击按钮添加了对名为 killProcessFromLineEdit() 的 SLOT 的访问权限,但附加的是我无法访问另一个名为 processIdToKill 的 QLineEdit,它会导致程序崩溃,而不会发出任何编译通知。
我想知道当信号接触插槽时,是否是我的 UI 对象的范围导致程序崩溃,因为如果我尝试从插槽访问任何 Widget,程序就会崩溃。
我使用 QtCreator 作为环境,使用 Linux 和 C++
代码可以直接浏览或下载:
https://sourceforge.net/p/nicesystemmonitor/code/ci/master/tree/
我已经被困了一段时间了,这让我抓狂:-)
帕特里克
PS:这是问题发生时我的调试器的图像以及它所附加的类的代码。
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>
#include <ios>
#include <iostream>
#include <fstream>
#include <string>
#include <dirent.h>
#include <stdio.h>
#include <cctype>
#include <stdlib.h>
#include <vector>
#include <sstream>
#include "renderprocesstablethread.h"
#include <proc/readproc.h>
#include <proc/procps.h>
#include "mainwindow.h"
#include <sys/types.h>
#include <signal.h>
using namespace std;
RenderProcessTableThread::RenderProcessTableThread(QObject *parent)
: QThread(parent)
{
restart = false;
abort = false;
}
RenderProcessTableThread::~RenderProcessTableThread()
{
mutex.lock();
abort = true;
condition.wakeOne();
mutex.unlock();
wait();
}
void RenderProcessTableThread::quitRenderProcessTableThread()
{
cout << "exit thread" << endl;
quit();
}
void RenderProcessTableThread::killProcessFromLineEdit()
{
cout << "getProcessIdToKill()->text().length() : " << getProcessIdToKill()->text().length() << endl;
if (getProcessIdToKill()->text().length() != 0) {
string s="kill -9 " + getProcessIdToKill()->text().toStdString();
system(s.c_str());
}
statusBar->showMessage(QString((char*)("killed process : " + getProcessIdToKill()->text().toStdString()).c_str()));
}
bool RenderProcessTableThread::isNum(char *s) {
int i = 0, flag;
while(s[i]){
//if there is a letter in a string then string is not a number
if(isalpha(s[i]) || s[i] == '.'){
flag = 0;
break;
}
else flag = 1;
i++;
}
if (flag == 1) return true;
else return false;
}
string RenderProcessTableThread::convertDouble(double value) {
std::ostringstream o;
if (!(o << value))
return "";
return o.str();
}
string RenderProcessTableThread::convertInt(int value) {
std::ostringstream o;
if (!(o << value))
return "";
return o.str();
}
void RenderProcessTableThread::run()
{
linesCount = countProcesses();
int myTableSize=0;
ui_tableWidgetProcessus->clearContents();
while (!abort) {
mutex.lock();
mutex.unlock();
vector<QStringList> myTableList;
myTableList = fillProcessTable(true);
myTableSize = myTableList.size();
// cout << myTableSize << endl;
// cout << "processIdToKill->text().length() : " << processIdToKill->text().length() << endl;
/* Checks what lines must be select according to filter */
for (int row=0; row<myTableSize; row++)
if (!(myTableList[row].at(0).contains(filterProcessTable->text(), Qt::CaseInsensitive) ||
myTableList[row].at(10).contains(filterProcessTable->text(), Qt::CaseInsensitive) ||
filterProcessTable->text().length() == 0)) {
myTableList.erase(myTableList.begin() + row);
myTableSize--;
row = -1;
}
ui_tableWidgetProcessus->setSortingEnabled(false);
ui_tableWidgetProcessus->setRowCount(myTableSize);
/* Fills the Table by either creating items or updating if exists */
for (int row=0; row<myTableSize; row++)
for (int column=0; column<11; column++) {
if (ui_tableWidgetProcessus->item(row, column) == 0) {
/* creates an item */
ui_tableWidgetProcessus->setItem(row,column,new QTableWidgetItem(myTableList[row].at(column),0));
} else {
/* function to get username from */
struct passwd *passwd;
passwd = getpwuid(getuid());
char *userName = passwd->pw_name;
/* set colors according to username */
if (myTableList[row].at(0).compare("root") == 0 && userName != "root")
ui_tableWidgetProcessus->item(row,0)->setBackgroundColor(Qt::red);
else if (myTableList[row].at(0).compare(userName) == 0)
ui_tableWidgetProcessus->item(row,0)->setBackgroundColor(Qt::green);
else
ui_tableWidgetProcessus->item(row,0)->setBackgroundColor(Qt::yellow);
/* updates an item */
ui_tableWidgetProcessus->item(row,column)->setText(myTableList[row].at(column));
}
}
emit renderedTable();
sleep(1);
//cout << "ça tourne" << endl;
}
mutex.lock();
if (!restart)
condition.wait(&mutex);
restart = false;
mutex.unlock();
}
QLineEdit *RenderProcessTableThread::getProcessIdToKill() const
{
return processIdToKill;
}
void RenderProcessTableThread::setProcessIdToKill(QLineEdit *value)
{
processIdToKill = value;
}
/* Prepares the process table */
void RenderProcessTableThread::setLocalMainWindow(MainWindow& w)
{
localMainWindow = &w;
ui_tableWidgetProcessus = localMainWindow->findChild<QTableWidget*>("tableWidgetProcessus");
ui_tableWidgetProcessus->setColumnCount(11);
ui_tableWidgetProcessus->setColumnWidth(10,508);
ui_ProcessusTabLayout = localMainWindow->findChild<QVBoxLayout*>("verticalLayout_3");
setProcessIdToKill(localMainWindow->findChild<QLineEdit*>("lineEdit_process"));
filterProcessTable = localMainWindow->findChild<QLineEdit*>("lineEdit_filter");
statusBar = localMainWindow->findChild<QStatusBar*>("statusBar");
QFont fnt;
fnt.setPointSize(10);
fnt.setFamily("Arial");
ui_tableWidgetProcessus->setFont(fnt);
QStringList labels;
labels << "user" << "pid" << "cpu" << "nice" << "vsz" << "rss" << "tty" << "stat" << "start" << "time" << "cmd";
ui_tableWidgetProcessus->setHorizontalHeaderLabels(labels);
}
int RenderProcessTableThread::countProcesses() {
PROCTAB* proc = openproc(PROC_FILLUSR | PROC_FILLMEM | PROC_FILLSTAT | PROC_FILLSTATUS | PROC_FILLARG);
proc_t proc_info;
memset(&proc_info, 0, sizeof(proc_info));
int i = 0;
while (readproc(proc, &proc_info) != NULL) {
i++;
}
return i;
}
/* Prepares a dynamic table of lists of the different elements to be put in the process table */
vector<QStringList> RenderProcessTableThread::fillProcessTable(bool update) {
vector<QStringList> myTableList;
QMutexLocker locker(&mutex);
if (!isRunning()) {
start(LowPriority);
} else {
restart = true;
condition.wakeOne();
}
PROCTAB* proc = openproc(PROC_FILLUSR | PROC_FILLMEM | PROC_FILLSTAT | PROC_FILLSTATUS | PROC_FILLARG);
proc_t proc_info;
memset(&proc_info, 0, sizeof(proc_info));
while (readproc(proc, &proc_info) != NULL) {
QStringList myLine;
myLine << QString(proc_info.fuser) << QString((char*)convertInt(proc_info.tid).c_str()) << QString((char*)convertInt(proc_info.pcpu).c_str())
<< QString((char*)convertInt(proc_info.nice).c_str()) << QString((char*)convertInt(proc_info.vm_size).c_str()) << QString((char*)convertInt(proc_info.rss).c_str())
<< QString((char*)convertInt(proc_info.tty).c_str()) << QString(proc_info.state) << QString((char*)convertInt(proc_info.start_time).c_str())
<< QString((char*)convertInt(proc_info.stime).c_str());
string text;
if (proc_info.cmdline != 0) {
vector<string> v(proc_info.cmdline, proc_info.cmdline + sizeof(proc_info.cmdline) / sizeof(string));
text = v[0];
}
else {
vector<string> v;
v.push_back(proc_info.cmd);
text = v[0];
}
myLine << QString((char*)text.c_str());
myTableList.push_back(myLine);
}
closeproc(proc);
return myTableList;
}
最佳答案
程序已经重新设计,线程和窗口交互很糟糕,现在一切正常。
问题已解决。
抱歉,我在第一篇文章中表达得不够清楚。
可以在以下位置找到运行正常的项目:
关于c++ - 也许 QThread 内 QTLineEdit 的范围会导致程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25958874/
我不能解决这个问题。和标题说的差不多…… 如果其他两个范围/列中有“否”,我如何获得范围或列的平均值? 换句话说,我想计算 A 列的平均值,并且我有两列询问是/否问题(B 列和 C 列)。我只希望 B
我知道 python 2to3 将所有 xrange 更改为 range 我没有发现任何问题。我的问题是关于它如何将 range(...) 更改为 list(range(...)) :它是愚蠢的,只是
我有一个 Primefaces JSF 项目,并且我的 Bean 注释有以下内容: @Named("reportTabBean") @SessionScoped public class Report
在 rails3 中,我在模型中制作了相同的范围。例如 class Common ?" , at) } end 我想将公共(public)范围拆分为 lib 中的模块。所以我试试这个。 module
我需要在另一个 View 范围 bean 中使用保存在 View 范围 bean 中的一些数据。 @ManagedBean @ViewScoped public class Attivita impl
为什么下面的代码输出4?谁能给我推荐一篇好文章来深入学习 javascript 范围。 这段代码返回4,但我不明白为什么? (function f(){ return f(); functio
我有一个与此结构类似的脚本 $(function(){ var someVariable; function doSomething(){ //here } $('#som
我刚刚开始学习 Jquery,但这些示例对我帮助不大...... 现在,以下代码发生的情况是,我有 4 个表单,我使用每个表单的链接在它们之间进行切换。但我不知道如何在第一个函数中获取变量“postO
为什么当我这样做时: function Dog(){ this.firstName = 'scrappy'; } Dog.firstName 未定义? 但是我可以这样做: Dog.firstNa
我想打印文本文件 text.txt 的选定部分,其中包含: tickme 1.1(no.3) lesson1-bases lesson2-advancedfurther para:using the
我正在编写一些 JavaScript 代码。我对这个关键字有点困惑。如何在 dataReceivedHandler 函数中访问 logger 变量? MyClass: { logger: nu
我有这个代码: Public Sub test() Dim Tgt As Range Set Tgt = Range("A1") End Sub 我想更改当前为“A1”的 Tgt 的引
我正忙于此工作,以为我会把它放在我们那里。 该数字必须是最多3个单位和最多5个小数位的数字,等等。 有效的 999.99999 99.9 9 0.99999 0 无效的 -0.1 999.123456
覆盖代码时: @Override public void open(ExecutionContext executionContext) { super.open(executio
我想使用 preg_match 来匹配数字 1 - 21。我如何使用 preg_match 来做到这一点?如果数字大于 21,我不想匹配任何东西。 example preg_match('([0-9]
根据docs range函数有四种形式: (range) 0 - 无穷大 (range end) 0 - 结束 (range start end)开始 - 结束 (range start end st
我知道有一个UISlider,但是有人已经制作了RangeSlider(用两个拇指吗?)或者知道如何扩展 uislider? 最佳答案 我认为你不能直接扩展 UISlider,你可能需要扩展 UICo
我正在尝试将范围转换为列表。 nums = [] for x in range (9000, 9004): nums.append(x) print nums 输出 [9000] [9
请注意:此问题是由于在运行我的修饰方法时使用了GraphQL解析器。这意味着this的范围为undefined。但是,该问题的基础知识对于装饰者遇到问题的任何人都是有用的。 这是我想使用的基本装饰器(
我正在尝试创建一个工具来从网页上抓取信息(是的,我有权限)。 到目前为止,我一直在使用 Node.js 结合 requests 和 Cheerio 来拉取页面,然后根据 CSS 选择器查找信息。我已经
我是一名优秀的程序员,十分优秀!