提交 e88f88a0 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

Add ui elems , enable dynamic paraments settings , such as add/remove threads\listen addresses

Start database develop
上级 aa196c60
......@@ -22,7 +22,8 @@ SOURCES += main.cpp\
smartlink/st_client_table.cpp \
pipeline/zp_plworkingthread.cpp \
smartlink/st_clientnode.cpp \
pipeline/zp_pltaskbase.cpp
pipeline/zp_pltaskbase.cpp \
database/databaseresource.cpp
HEADERS += zpmainframe.h \
network/zp_tcpserver.h \
......@@ -34,7 +35,8 @@ HEADERS += zpmainframe.h \
pipeline/zp_plworkingthread.h \
smartlink/st_clientnode.h \
smartlink/st_message.h \
pipeline/zp_pltaskbase.h
pipeline/zp_pltaskbase.h \
database/databaseresource.h
FORMS += zpmainframe.ui
......
#include "databaseresource.h"
#include <QThread>
DatabaseResource::DatabaseResource(QObject *parent) :
QObject(parent)
{
}
//!Get an database connection belong to current thread.
//!if database does not exist, it will be added using dbtype
QSqlDatabase & DatabaseResource::databse(const QString & strDBName, const QString & dbtype)
{
Qt::HANDLE handleThread = QThread::currentThreadId();
QString internal_name = QString("%1_%2").arg(strDBName).arg((quint64)(handleThread));
if (false==m_map_databses.contains(internal_name))
m_map_databses[internal_name] = QSqlDatabase::addDatabase(dbtype,internal_name);
return m_map_databses[internal_name];
}
//!Remove Database
void DatabaseResource::remove_db(const QString & strDBName)
{
Qt::HANDLE handleThread = QThread::currentThreadId();
QString internal_name = QString("%1_%2").arg(strDBName).arg((quint64)(handleThread));
if (true==m_map_databses.contains(internal_name))
{
QSqlDatabase::removeDatabase(internal_name);
m_map_databses.remove(internal_name);
}
}
//!Prepare for db connection operations.
//!in multi-thread programs, db add, remove, conn should be protected with mutex,
void DatabaseResource::PrepareDbReg()
{
m_mutex_reg.lock();
}
void DatabaseResource::FinishDbReg()
{
m_mutex_reg.unlock();
}
#ifndef DATABASERESOURCE_H
#define DATABASERESOURCE_H
#include <QObject>
#include <QMap>
#include <QSqlDatabase>
#include <QString>
#include <QMutex>
//!this class provide an database reource,
//!In different thread, workers can get existing db connections
//! immediately without re-creation operations.
class DatabaseResource : public QObject
{
Q_OBJECT
public:
explicit DatabaseResource(QObject *parent = 0);
//!Get an database connection belong to current thread.
//!if database does not exist, it will be added using dbtype
QSqlDatabase & databse(const QString & strDBName, const QString & dbtype);
//!Remove Database
void remove_db(const QString & strDBName);
//!Prepare for db connection operations.
//!in multi-thread programs, db add, remove, conn should be protected with mutex,
void PrepareDbReg();
void FinishDbReg();
protected:
QMap<QString, QSqlDatabase> m_map_databses;
QMutex m_mutex_reg;
signals:
public slots:
};
#endif // DATABASERESOURCE_H
......@@ -22,6 +22,19 @@ int zp_net_ThreadPool::TransThreadNum()
{
return m_vec_NetTransThreads.size();
}
int zp_net_ThreadPool::TransThreadNum(bool bSSL)
{
//m_mutex_trans.lock();
int nsz = m_vec_NetTransThreads.size();
int nCount = 0;
for (int i=0;i<nsz;i++)
{
if (m_vec_NetTransThreads[i]->SSLConnection()==bSSL)
nCount ++;
}
//m_mutex_trans.unlock();
return nCount;
}
int zp_net_ThreadPool::totalClients(int idxThread)
{
......@@ -223,22 +236,21 @@ void zp_net_ThreadPool::DeactiveImmediately()
//Remove n client-Trans Thread(s).a thread marked reomved will be terminated after its last client socket exited.
void zp_net_ThreadPool::RemoveClientTransThreads(int nThreads,bool bSSL)
{
if (nThreads>0)
//m_mutex_trans.lock();
int nsz = m_vec_NetTransThreads.size();
if (nThreads<0)
nThreads = nsz;
int nCount = 0;
for (int i=0;i<nsz && nCount<nThreads;i++)
{
//m_mutex_trans.lock();
int nsz = m_vec_NetTransThreads.size();
int nCount = 0;
for (int i=0;i<nsz && nCount<nThreads;i++)
if (m_vec_NetTransThreads[i]->SSLConnection()==bSSL)
{
if (m_vec_NetTransThreads[i]->SSLConnection()==bSSL)
{
m_vec_NetTransThreads[i]->Deactivate();
nCount ++;
}
m_vec_NetTransThreads[i]->Deactivate();
nCount ++;
}
//m_mutex_trans.unlock();
}
//m_mutex_trans.unlock();
}
void zp_net_ThreadPool::SendDataToClient(QObject * objClient,const QByteArray & dtarray)
......
......@@ -47,6 +47,7 @@ public:
//The status
QStringList ListenerNames();
int TransThreadNum();
int TransThreadNum(bool bSSL);
int totalClients(int idxThread);
protected:
......
......@@ -42,7 +42,7 @@ public slots:
//Broadcast dtarray to every client except objFromClient itself
void BroadcastData(QObject * objFromClient,const QByteArray & dtarray);
//Set terminate mark, the thread will quit after last client quit.
void Deactivate(){m_bActivated = true;}
void Deactivate(){m_bActivated = false;}
//terminate this thread immediately
void DeactivateImmediately(zp_netTransThread *);
//Kick all clients .
......
#include "zpmainframe.h"
#include "ui_zpmainframe.h"
#include <QDateTime>
#include <QDialog>
#include <QSettings>
#include <QMessageBox>
#include <QFileDialog>
using namespace ZPNetwork;
using namespace ZPTaskEngine;
ZPMainFrame::ZPMainFrame(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ZPMainFrame)
{
m_currentConffile = QCoreApplication::applicationFilePath()+".ini";
ui->setupUi(this);
//Create net engine
m_netEngine = new zp_net_ThreadPool (4096);
connect (m_netEngine,&zp_net_ThreadPool::evt_Message,this,&ZPMainFrame::on_evt_Message);
connect (m_netEngine,&zp_net_ThreadPool::evt_SocketError,this,&ZPMainFrame::on_evt_SocketError);
m_netEngine->AddListeningAddress("23456_Plain",QHostAddress::Any,23456,false);
m_netEngine->AddListeningAddress("23457_SSL",QHostAddress::Any,23457,true);
m_netEngine->AddClientTransThreads(4,false);
m_netEngine->AddClientTransThreads(4,true);
//Create TaskEngine
m_taskEngine = new zp_pipeline(this);
m_taskEngine->addThreads(4);
//Create Smartlink client table
m_clientTable = new SmartLink::st_client_table (m_netEngine,m_taskEngine,this);
m_nTimerId = startTimer(500);
m_pMsgModel = new QStandardItemModel(this);
ui->listView_msg->setModel(m_pMsgModel);
initUI();
LoadSettings(m_currentConffile);
}
ZPMainFrame::~ZPMainFrame()
......@@ -65,6 +57,23 @@ void ZPMainFrame::changeEvent(QEvent *e)
break;
}
}
void ZPMainFrame::initUI()
{
//Message Shown model
m_pMsgModel = new QStandardItemModel(this);
ui->listView_msg->setModel(m_pMsgModel);
//Network listeners setting model
m_pListenerModel = new QStandardItemModel(0,4,this);
m_pListenerModel->setHeaderData(0,Qt::Horizontal,tr("Name"));
m_pListenerModel->setHeaderData(1,Qt::Horizontal,tr("Addr"));
m_pListenerModel->setHeaderData(2,Qt::Horizontal,tr("Port"));
m_pListenerModel->setHeaderData(3,Qt::Horizontal,tr("SSL"));
ui->tableView_listen->setModel(m_pListenerModel);
}
//These Message is nessery.-------------------------------------
void ZPMainFrame::on_evt_Message(const QString & strMsg)
{
......@@ -113,3 +122,233 @@ void ZPMainFrame::timerEvent(QTimerEvent * e)
ui->plainTextEdit_status_net->setPlainText(str_msg);
}
}
void ZPMainFrame::on_action_Start_Stop_triggered(bool setordel)
{
if (setordel==true)
{
forkServer(m_currentConffile);
}
else
{
m_netEngine->RemoveAllAddresses();
m_netEngine->RemoveClientTransThreads(-1,true);
m_netEngine->RemoveClientTransThreads(-1,false);
m_taskEngine->removeThreads(-1);
while (m_netEngine->CanExit()==false || m_taskEngine->canClose()==false)
{
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
QThread::currentThread()->msleep(200);
}
}
}
void ZPMainFrame::forkServer(const QString & config_file)
{
QSettings settings(config_file,QSettings::IniFormat);
int nListeners = settings.value("settings/listeners",0).toInt();
if (nListeners<0)
nListeners = 0;
if (nListeners>=1024)
nListeners = 1024;
//read listeners from ini
m_netEngine->RemoveAllAddresses();
while (m_netEngine->ListenerNames().size())
{
QThread::currentThread()->msleep(200);
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
for (int i=0;i<nListeners;i++)
{
QString keyPrefix = QString ("listener%1/").arg(i);
QString listen_name = settings.value(keyPrefix+"name",
QString("Listener%1").arg(i)).toString();
QString Address = settings.value(keyPrefix+"address",
QString("127.0.0.1")).toString();
QHostAddress listen_address (Address) ;
int nPort = settings.value(keyPrefix+"port",23456+i).toInt();
bool bSSL = settings.value(keyPrefix+"ssl",i%2?true:false).toBool();
if (listen_address.isNull()==true || nPort<1024 || nPort>=32768 )
continue;
m_netEngine->AddListeningAddress(listen_name,listen_address,nPort,bSSL);
}
//read thread config
int nSSLThreads = settings.value("settings/nSSLThreads",4).toInt();
int nPlainThreads = settings.value("settings/nPlainThreads",4).toInt();
int nWorkingThreads = settings.value("settings/nWorkingThreads",8).toInt();
int nDeltaSSL = m_netEngine->TransThreadNum(true) - nSSLThreads;
if (nDeltaSSL>0)
m_netEngine->RemoveClientTransThreads(nDeltaSSL,true);
else if (nDeltaSSL<0)
m_netEngine->AddClientTransThreads(-nDeltaSSL,true);
int nDeltaPlain = m_netEngine->TransThreadNum(false) - nPlainThreads;
if (nDeltaPlain>0)
m_netEngine->RemoveClientTransThreads(nDeltaPlain,false);
else if (nDeltaPlain<0)
m_netEngine->AddClientTransThreads(-nDeltaPlain,false);
int nDeltaWorking = m_taskEngine->threadsCount() - nWorkingThreads;
if (nDeltaWorking>0)
m_taskEngine->removeThreads(nDeltaWorking);
else
m_taskEngine->addThreads(-nDeltaWorking);
}
void ZPMainFrame::on_action_About_triggered()
{
QApplication::aboutQt();
}
void ZPMainFrame::LoadSettings(const QString & config_file)
{
QSettings settings(config_file,QSettings::IniFormat);
int nListeners = settings.value("settings/listeners",0).toInt();
if (nListeners<0)
nListeners = 0;
if (nListeners>=1024)
nListeners = 1024;
m_pListenerModel->removeRows(0,m_pListenerModel->rowCount());
m_set_listenerNames.clear();
//read listeners from ini
int nInserted = 0;
for (int i=0;i<nListeners;i++)
{
QString keyPrefix = QString ("listener%1/").arg(i);
QString listen_name = settings.value(keyPrefix+"name",
QString("Listener%1").arg(i)).toString();
QString Address = settings.value(keyPrefix+"address",
QString("127.0.0.1")).toString();
QHostAddress listen_address (Address) ;
int nPort = settings.value(keyPrefix+"port",23456+i).toInt();
bool bSSL = settings.value(keyPrefix+"ssl",i%2?true:false).toBool();
if (listen_address.isNull()==true || nPort<1024 || nPort>=32768 )
continue;
if (m_set_listenerNames.contains(listen_name))
continue;
m_set_listenerNames.insert(listen_name);
m_pListenerModel->insertRow(nInserted);
m_pListenerModel->setData(m_pListenerModel->index(nInserted,0),listen_name);
m_pListenerModel->setData(m_pListenerModel->index(nInserted,1),listen_address.toString());
m_pListenerModel->setData(m_pListenerModel->index(nInserted,2),nPort);
m_pListenerModel->setData(m_pListenerModel->index(nInserted,3),bSSL);
nInserted++;
}
//read thread config
int nSSLThreads = settings.value("settings/nSSLThreads",4).toInt();
int nPlainThreads = settings.value("settings/nPlainThreads",4).toInt();
int nWorkingThreads = settings.value("settings/nWorkingThreads",8).toInt();
ui->dial_plain_trans_threads->setValue(nPlainThreads);
ui->dial_ssl_trans_threads->setValue(nSSLThreads);
ui->dial_task_working_threads->setValue(nWorkingThreads);
}
void ZPMainFrame::SaveSettings(const QString & config_file)
{
QSettings settings(config_file,QSettings::IniFormat);
int nListeners = m_pListenerModel->rowCount();
settings.setValue("settings/listeners",nListeners);
//save listeners to ini
int nRealsave = 0;
for (int i=0;i<nListeners;i++)
{
QString keyPrefix = QString ("listener%1/").arg(nRealsave);
QString listen_name = m_pListenerModel->data(m_pListenerModel->index(i,0)).toString();
settings.setValue(keyPrefix+"name",listen_name);
QHostAddress listen_address (m_pListenerModel->data(m_pListenerModel->index(i,1)).toString()) ;
settings.setValue(keyPrefix+"address",listen_address.toString());
int nPort = m_pListenerModel->data(m_pListenerModel->index(i,2)).toInt();
settings.setValue(keyPrefix+"port",nPort);
bool bSSL = m_pListenerModel->data(m_pListenerModel->index(i,3)).toBool();
settings.setValue(keyPrefix+"ssl",bSSL);
if (listen_name.length()<=0 || nPort<1024 || nPort>32767)
continue;
nRealsave++;
}
settings.setValue("settings/listeners",nRealsave);
//save thread config
int nSSLThreads = ui->dial_plain_trans_threads->value();
settings.setValue("settings/nPlainThreads",nSSLThreads);
int nPlainThreads = ui->dial_ssl_trans_threads->value();
settings.setValue("settings/nSSLThreads",nPlainThreads);
int nWorkingThreads = ui->dial_task_working_threads->value();
settings.setValue("settings/nWorkingThreads",nWorkingThreads);
}
void ZPMainFrame::on_pushButton_addListener_clicked()
{
QString name = ui->lineEdit_listenerName->text();
QString Addr = ui->lineEdit_listenerAddr->text();
QHostAddress address(Addr);
if (address.isNull())
address = QHostAddress(QHostAddress::Any);
QString Port = ui->lineEdit_listenerPort->text();
int nPort = Port.toInt();
bool bSSL = ui->checkBox_listener_ssl->isChecked();
if (m_set_listenerNames.contains(name))
{
QMessageBox::information(this,tr("Name Already Used."),tr("The listener name has been used."));
return;
}
if (address.isNull()==true || nPort<1024 || nPort>32767)
{
QMessageBox::information(this,tr("Invalid Paraments."),tr("Address must be valid, Port between 1024 to 32767."));
return;
}
int nRowCount = m_pListenerModel->rowCount();
m_pListenerModel->insertRow(nRowCount);
m_pListenerModel->setData(m_pListenerModel->index(nRowCount,0),name);
m_pListenerModel->setData(m_pListenerModel->index(nRowCount,1),address.toString());
m_pListenerModel->setData(m_pListenerModel->index(nRowCount,2),nPort);
m_pListenerModel->setData(m_pListenerModel->index(nRowCount,3),bSSL);
m_set_listenerNames.insert( name);
}
void ZPMainFrame::on_pushButton_delListener_clicked()
{
auto ptr = ui->tableView_listen->selectionModel();
QModelIndexList lst = ptr->selectedIndexes();
QSet<int> nRows;
foreach (auto item, lst)
nRows.insert(item.row());
int nct = 0;
foreach (int row, nRows)
{
m_pListenerModel->removeRow(row - nct);
nct++;
}
}
void ZPMainFrame::on_pushButton_listerner_apply_clicked()
{
SaveSettings(m_currentConffile);
//forkServer(m_currentConffile);
}
void ZPMainFrame::on_pushButton_threadsApply_clicked()
{
SaveSettings(m_currentConffile);
//forkServer(m_currentConffile);
}
void ZPMainFrame::on_actionReload_config_file_triggered()
{
QString filename = QFileDialog::getOpenFileName(this,tr("Open Conf file"),QCoreApplication::applicationDirPath(),
tr("Ini files(*.ini)"));
if (filename.length()>0)
{
SaveSettings(m_currentConffile);
m_currentConffile = filename;
LoadSettings(m_currentConffile);
forkServer(m_currentConffile);
}
}
......@@ -3,6 +3,7 @@
#include <QMainWindow>
#include <QStandardItemModel>
#include <QSet>
#include "network/zp_net_threadpool.h"
#include "pipeline/zp_pipeline.h"
#include "smartlink/st_client_table.h"
......@@ -22,17 +23,38 @@ protected:
void changeEvent(QEvent *e);
void timerEvent(QTimerEvent *);
QStandardItemModel * m_pMsgModel;
//Config File Name
QString m_currentConffile;
//Listeners settings
QStandardItemModel * m_pListenerModel;
QSet<QString> m_set_listenerNames;
private:
Ui::ZPMainFrame *ui;
ZPNetwork::zp_net_ThreadPool * m_netEngine;
ZPTaskEngine::zp_pipeline * m_taskEngine;
SmartLink::st_client_table * m_clientTable;
int m_nTimerId;
void initUI();
void LoadSettings(const QString & config_file);
void SaveSettings(const QString & config_file);
void forkServer(const QString & config_file);
public slots:
//These Message is nessery.-------------------------------------
void on_evt_Message(const QString &);
//The socket error message
void on_evt_SocketError(QObject * senderSock ,QAbstractSocket::SocketError socketError);
void on_action_Start_Stop_triggered(bool);
void on_action_About_triggered();
void on_actionReload_config_file_triggered();
void on_pushButton_addListener_clicked();
void on_pushButton_delListener_clicked();
void on_pushButton_listerner_apply_clicked();
void on_pushButton_threadsApply_clicked();
};
#endif // ZPMAINFRAME_H
......@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>452</width>
<height>310</height>
<width>556</width>
<height>413</height>
</rect>
</property>
<property name="windowTitle">
......@@ -34,6 +34,307 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_settings">
<attribute name="icon">
<iconset resource="resource.qrc">
<normaloff>:/icons/Resources/19-1.png</normaloff>:/icons/Resources/19-1.png</iconset>
</attribute>
<attribute name="title">
<string>Settings</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTabWidget" name="tabWidget_Settings">
<property name="tabPosition">
<enum>QTabWidget::South</enum>
</property>
<property name="tabShape">
<enum>QTabWidget::Triangular</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_set_network">
<attribute name="icon">
<iconset resource="resource.qrc">
<normaloff>:/icons/Resources/4003.png</normaloff>:/icons/Resources/4003.png</iconset>
</attribute>
<attribute name="title">
<string>Listeners</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Current Listeners</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tableView_listen"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_listenerName"/>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Addr</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_listenerAddr"/>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Port</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_listenerPort"/>
</item>
<item>
<widget class="QCheckBox" name="checkBox_listener_ssl">
<property name="text">
<string>SSL Connection</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_addListener">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_delListener">
<property name="text">
<string>Del</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_listerner_apply">
<property name="text">
<string>Apply</string>
</property>
<property name="icon">
<iconset resource="resource.qrc">
<normaloff>:/icons/Resources/3floppy_mount-2.png</normaloff>:/icons/Resources/3floppy_mount-2.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_taskPools">
<attribute name="icon">
<iconset resource="resource.qrc">
<normaloff>:/icons/Resources/27_Martin.png</normaloff>:/icons/Resources/27_Martin.png</iconset>
</attribute>
<attribute name="title">
<string>Task Pools</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="1">
<widget class="QDial" name="dial_task_working_threads">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>256</number>
</property>
<property name="pageStep">
<number>16</number>
</property>
<property name="notchTarget">
<double>8.000000000000000</double>
</property>
<property name="notchesVisible">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QProgressBar" name="progressBar_ssl_threads">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>64</number>
</property>
<property name="value">
<number>1</number>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Working Task Threads</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QProgressBar" name="progressBar_plain_threads">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>64</number>
</property>
<property name="value">
<number>1</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDial" name="dial_ssl_trans_threads">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>64</number>
</property>
<property name="pageStep">
<number>8</number>
</property>
<property name="wrapping">
<bool>false</bool>
</property>
<property name="notchTarget">
<double>4.000000000000000</double>
</property>
<property name="notchesVisible">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>SSL connection Trans Threads</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Plain connection Trans Threads</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QProgressBar" name="progressBar_working_threads">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>256</number>
</property>
<property name="value">
<number>1</number>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDial" name="dial_plain_trans_threads">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>64</number>
</property>
<property name="pageStep">
<number>8</number>
</property>
<property name="notchesVisible">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="pushButton_threadsApply">
<property name="text">
<string>Apply</string>
</property>
<property name="icon">
<iconset resource="resource.qrc">
<normaloff>:/icons/Resources/3floppy_mount-1.png</normaloff>:/icons/Resources/3floppy_mount-1.png</iconset>
</property>
</widget>
</item>
<item row="4" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_set_db">
<attribute name="icon">
<iconset resource="resource.qrc">
<normaloff>:/icons/Resources/Color Classic.png</normaloff>:/icons/Resources/Color Classic.png</iconset>
</attribute>
<attribute name="title">
<string>Database</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_task">
<attribute name="icon">
<iconset resource="resource.qrc">
......@@ -57,7 +358,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>452</width>
<width>556</width>
<height>23</height>
</rect>
</property>
......@@ -66,6 +367,7 @@
<string>&amp;Control</string>
</property>
<addaction name="action_Start_Stop"/>
<addaction name="actionReload_config_file"/>
<addaction name="separator"/>
<addaction name="actionExit"/>
</widget>
......@@ -86,6 +388,7 @@
<bool>false</bool>
</attribute>
<addaction name="action_Start_Stop"/>
<addaction name="actionReload_config_file"/>
<addaction name="separator"/>
<addaction name="action_About"/>
</widget>
......@@ -120,10 +423,87 @@
<string>&amp;About</string>
</property>
</action>
<action name="actionReload_config_file">
<property name="icon">
<iconset resource="resource.qrc">
<normaloff>:/icons/Resources/Color, Lime.png</normaloff>:/icons/Resources/Color, Lime.png</iconset>
</property>
<property name="text">
<string>&amp;Reload config file</string>
</property>
<property name="toolTip">
<string>Reload Config file</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="resource.qrc"/>
</resources>
<connections/>
<connections>
<connection>
<sender>dial_plain_trans_threads</sender>
<signal>valueChanged(int)</signal>
<receiver>progressBar_plain_threads</receiver>
<slot>setValue(int)</slot>
<hints>
<hint type="sourcelabel">
<x>266</x>
<y>145</y>
</hint>
<hint type="destinationlabel">
<x>421</x>
<y>144</y>
</hint>
</hints>
</connection>
<connection>
<sender>dial_ssl_trans_threads</sender>
<signal>valueChanged(int)</signal>
<receiver>progressBar_ssl_threads</receiver>
<slot>setValue(int)</slot>
<hints>
<hint type="sourcelabel">
<x>266</x>
<y>219</y>
</hint>
<hint type="destinationlabel">
<x>421</x>
<y>219</y>
</hint>
</hints>
</connection>
<connection>
<sender>dial_task_working_threads</sender>
<signal>valueChanged(int)</signal>
<receiver>progressBar_working_threads</receiver>
<slot>setValue(int)</slot>
<hints>
<hint type="sourcelabel">
<x>266</x>
<y>294</y>
</hint>
<hint type="destinationlabel">
<x>421</x>
<y>293</y>
</hint>
</hints>
</connection>
<connection>
<sender>actionExit</sender>
<signal>triggered()</signal>
<receiver>ZPMainFrame</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>277</x>
<y>206</y>
</hint>
</hints>
</connection>
</connections>
</ui>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册