multithreading.h头文件:

#ifndef MULTITHREADING_H
#define MULTITHREADING_H#include <math.h>
#include <Python.h>
#include <string>
#include <iostream>
#include <QString>
using namespace std;extern QString SessId;
extern QString Permission;
extern int SearchWidgetState;class MyThreadStateLockCls
{
public:MyThreadStateLockCls(void){state = PyGILState_Ensure();}~MyThreadStateLockCls(void){PyGILState_Release(state);}
private:PyGILState_STATE state;
};
QString MyCallPyFun(string fileName,string functionName,PyObject* inputTuple);
QString get_journal(QString sess_id, int jour_id=-1, QString name="",QString issn="", QString isbn="", QString post="",QString host="", QString addr="", int freq=-1,QString lang="", QString hist="", QString used="");
QString sign_up(QString username, QString nickname, QString password, QString forename="",QString lastname="", QString mailAddr="", QString phoneNum="");#endif // MULTITHREADING_H

multithreading.cpp源文件

#include <multithreading.h>QString SessId = "";
QString Permission = "";
int SearchWidgetState = -1;QString MyCallPyFun(string fileName,string functionName,PyObject* inputTuple)
{PyEval_InitThreads();PyEval_ReleaseThread(PyThreadState_Get());PyObject* outputTuple;{class MyThreadStateLockCls myLock;//获取全局锁// 调用python的API函数处理PyObject *pModule = PyImport_ImportModule(fileName.data());if (!pModule){PyGILState_Ensure();cout<<"Can not import python module file"<<endl;return 0;}PyObject *pFun = PyObject_GetAttrString(pModule,functionName.data());if (!pFun){PyGILState_Ensure();cout<<"Can not get python function"<<endl;return 0;}outputTuple = PyObject_CallObject(pFun,inputTuple);if(!outputTuple){PyGILState_Ensure();cout<<"The called function returns NULL"<<endl;return 0;}else {cout<<"Called function completed"<<endl;}}PyGILState_Ensure();char *charStr;PyArg_ParseTuple(outputTuple, "s", &charStr);QString output = charStr;return output;
}
QString get_journal(QString sess_id, int jour_id, QString name,QString issn, QString isbn, QString post,QString host, QString addr, int freq, QString lang,QString hist, QString used){string file = "Program";string fun = "get_journal";PyObject *input = PyTuple_New(12);PyTuple_SetItem(input, 0, Py_BuildValue("s",sess_id.toStdString().data()));if(jour_id==-1)PyTuple_SetItem(input, 1, Py_BuildValue(""));else PyTuple_SetItem(input, 1, Py_BuildValue("i",jour_id));if(name=="")PyTuple_SetItem(input, 2, Py_BuildValue(""));else PyTuple_SetItem(input, 2, Py_BuildValue("s",name.toStdString().data()));if(issn=="")PyTuple_SetItem(input, 3, Py_BuildValue(""));else PyTuple_SetItem(input, 3, Py_BuildValue("s",issn.toStdString().data()));if(isbn=="")PyTuple_SetItem(input, 4, Py_BuildValue(""));else PyTuple_SetItem(input, 4, Py_BuildValue("s",isbn.toStdString().data()));if(post=="")PyTuple_SetItem(input, 5, Py_BuildValue(""));else PyTuple_SetItem(input, 5, Py_BuildValue("s",post.toStdString().data()));if(host=="")PyTuple_SetItem(input, 6, Py_BuildValue(""));else PyTuple_SetItem(input, 6, Py_BuildValue("s",host.toStdString().data()));if(addr=="")PyTuple_SetItem(input, 7, Py_BuildValue(""));else PyTuple_SetItem(input, 7, Py_BuildValue("s",addr.toStdString().data()));if(freq==-1)PyTuple_SetItem(input, 8, Py_BuildValue(""));else PyTuple_SetItem(input, 8, Py_BuildValue("i",freq));if(lang=="")PyTuple_SetItem(input, 9, Py_BuildValue(""));else PyTuple_SetItem(input, 9, Py_BuildValue("s",lang.toStdString().data()));if(hist=="")PyTuple_SetItem(input, 10, Py_BuildValue(""));else PyTuple_SetItem(input, 10, Py_BuildValue("s",hist.toStdString().data()));if(used=="")PyTuple_SetItem(input, 11, Py_BuildValue(""));else PyTuple_SetItem(input, 11, Py_BuildValue("s",used.toStdString().data()));return MyCallPyFun(file,fun,input);
}QString sign_up(QString username, QString nickname, QString password, QString forename,QString lastname, QString mailAddr, QString phoneNum){string file = "Program";string fun = "sign_up";PyObject *input = PyTuple_New(7);PyTuple_SetItem(input, 0, Py_BuildValue("s",username.toStdString().data()));PyTuple_SetItem(input, 1, Py_BuildValue("s",nickname.toStdString().data()));PyTuple_SetItem(input, 2, Py_BuildValue("s",password.toStdString().data()));if(forename=="")PyTuple_SetItem(input, 3, Py_BuildValue(""));else PyTuple_SetItem(input, 3, Py_BuildValue("s",forename.toStdString().data()));if(lastname=="")PyTuple_SetItem(input, 4, Py_BuildValue(""));else PyTuple_SetItem(input, 4, Py_BuildValue("s",lastname.toStdString().data()));if(mailAddr=="")PyTuple_SetItem(input, 5, Py_BuildValue(""));else PyTuple_SetItem(input, 5, Py_BuildValue("s",mailAddr.toStdString().data()));if(phoneNum=="")PyTuple_SetItem(input, 6, Py_BuildValue(""));else PyTuple_SetItem(input, 6, Py_BuildValue("s",phoneNum.toStdString().data()));return MyCallPyFun(file,fun,input);
}

调用举例:

QString QStrSignUp = sign_up(ui->LineAccountName->text(),ui->LineNickname->text(),ui->LinePassword->text(),ui->LineFirstName->text(),ui->LineLastName->text(),ui->LineEmail->text(),ui->LineTel->text());
//qDebug()<<QStrSignUp;
QString JudgeNickname = QStrSignUp.section(";",0,0);
if(JudgeNickname == "409"){ui->Text2->setFont(font);ui->Text2->setText("用户名或昵\n称已被注册");ui->Text2->show();ui->Text1->setFont(font);ui->Text1->setText("用户名或昵\n称已被注册");ui->Text1->show();
}

Program.py

from urllib import request
import json
from datetime import datetime, timedelta
from json import JSONEncoder
import socket
socket.setdefaulttimeout(1)class DatetimeEncoder(JSONEncoder):"""Help to jsonify the datetime.Still need to loads it manually."""def default(self, o):if isinstance(o, datetime):return o.timestamp()return super().default(0)def json_rpc(method, params, id=0, jsonrpc='2.0', url='http://127.0.0.1/'):try:headers = {'Content-Type': 'application/json'}data = {'method': method, 'params': params, 'id': id, 'jsonrpc': jsonrpc}#r = requests.post(url, json=data, headers=headers)data = json.dumps(data,cls = DatetimeEncoder).encode('utf-8')req = request.Request(url, data=data, headers=headers)r = request.urlopen(req)assert r.getcode()==200text = r.read().decode('utf-8')return json.loads(text)except Exception:return {'error': {'code': 404, 'message': 'Failed to request'}}def restart_world():resp = json_rpc('restart_world', [])#强烈推荐注册管理员,5元包月
def admin_sign_up(username, nickname, password, forename=None, lastname=None, mailAddr=None, phoneNum=None):resp = json_rpc('admin_sign_up', [username, nickname, password, forename, lastname, mailAddr, phoneNum])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+resp['result'],def sign_up(username, nickname, password, forename=None, lastname=None, mailAddr=None, phoneNum=None):resp = json_rpc('sign_up', [username, nickname, password, forename, lastname, mailAddr, phoneNum])if 'error' in resp: #出错return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+resp['result'], #未出错,返回str类型的iddef sign_in(username, password):resp = json_rpc('sign_in', [username, password])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+resp['result'],#返回str类型的iddef sign_out(sess_id):resp = json_rpc('sign_out', [sess_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef get_user(sess_id):resp = json_rpc('get_user', [sess_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),t=[str(x) for x in resp['result'].values()]t = ','.join(t)return '0;'+t,#返回元组,包含该用户的所有信息def get_user_advanced(sess_id,user_id = None,username=None,nickname=None,forename=None,lastname=None,mailaddr=None,phonenum=None):resp = json_rpc('get_user_advanced', [sess_id,user_id, username,nickname,forename,lastname,mailaddr,phonenum])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:t = [str(x) for x in i.values()]obj = ','.join(t)a.append(obj)a = ';'.join(a)#'{0};{1};{2}'.format(0,len(),a)return '0;'+str(len(resp['result']))+';'+a,#返回期刊元组的列表def set_user(sess_id, nickname=None, password=None, forename=None, lastname=None, mailAddr=None, phoneNum=None):resp = json_rpc('set_user', [sess_id, nickname, password, forename, lastname, mailAddr, phoneNum])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef del_user(sess_id):resp = json_rpc('del_user', [sess_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef add_journal(sess_id, name, issn, isbn, post, host, addr, freq, lang, hist=None, used=None):if hist is not None:if not hist.isdigit():hist=Noneelse:hist=int(hist)resp = json_rpc('add_journal', [sess_id, name, issn, isbn, post, host, addr, freq, lang, hist, used])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回int类型期刊iddef get_journal(sess_id, jour_id=None, name=None, issn=None, isbn=None, post=None, host=None, addr=None, freq=None, lang=None, hist=None, used=None):if hist is not None:if not hist.isdigit():hist=Noneelse:hist=int(hist)resp = json_rpc('get_journal_advanced', [sess_id, jour_id, name, issn, isbn, post, host, addr, freq, lang, hist, used])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:t = [str(x) for x in i.values()]obj = ','.join(t)a.append(obj)a = ';'.join(a)#'{0};{1};{2}'.format(0,len(),a)return '0;'+str(len(resp['result']))+';'+a,#返回期刊元组的列表def get_journal_reverse(sess_id, subs_id, sto_id, bor_id):resp = json_rpc('get_journal_reverse', [sess_id, subs_id, sto_id, bor_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),t=[str(x) for x in resp['result'].values()]t = ','.join(t)return '0;'+t,def set_journal(sess_id, jour_id, name=None, issn=None, isbn=None, post=None, host=None, addr=None, freq=None, lang=None, hist=None, used=None):if hist is not None:if not hist.isdigit():hist=Noneelse:hist=int(hist)resp = json_rpc('set_journal', [sess_id, jour_id, name, issn, isbn, post, host, addr, freq, lang, hist, used])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef del_journal(sess_id, jour_id):resp = json_rpc('del_journal', [sess_id, jour_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef add_subscribe(sess_id, year, jour_id):resp = json_rpc('add_subscribe', [sess_id, year, jour_id])#int yearif 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回int类型的subs_iddef get_subscribe(sess_id, subs_id=None, year=None, jour_id=None):resp = json_rpc('get_subscribe', [sess_id, subs_id, year, jour_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:t = [str(x) for x in i.values()]obj = ','.join(t)a.append(obj)a = ';'.join(a)return '{0};{1};{2}'.format(0,len(resp['result']),a),#返回征订项元组的列表def chaifen_jour(obj):t=[str(x) for x in obj['journal'].values()]t = ','.join(t)obj['journal'] = tdef get_subscribe_full(sess_id, subs_id=None, year=None, jour_id=None):resp = json_rpc('get_subscribe_full', [sess_id, subs_id, year, jour_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:chaifen_jour(i)t = [str(x) for x in i.values()]obj = ','.join(t)a.append(obj)a = ';'.join(a)return '{0};{1};{2}'.format(0,len(resp['result']),a),def set_subscribe(sess_id, subs_id, year=None, jour_id=None):resp = json_rpc('set_subscribe', [sess_id, subs_id, year, jour_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef del_subscribe(sess_id, subs_id):resp = json_rpc('del_subscribe', [sess_id, subs_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef add_storage(sess_id, vol, num, subs_id):resp = json_rpc('add_storage', [sess_id, vol, num, subs_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回int类型sto_iddef get_storage(sess_id, sto_id=None, vol=None, num=None, subs_id=None,):resp = json_rpc('get_storage', [sess_id, sto_id, vol, num, subs_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:t = [str(x) for x in i.values()]obj = ','.join(t)a.append(obj)a = ';'.join(a)return '0;'+str(len(resp['result']))+';'+a,#返回存储项元组的列表def chaifen_stor(obj):inobj = obj['subscribe']t=[str(x) for x in inobj['journal'].values()]t = ','.join(t)inobj['journal'] = tv=[str(x) for x in obj['subscribe'].values()]v = ','.join(v)obj['subscribe'] = vdef get_storage_full(sess_id, sto_id=None, vol=None, num=None, sub_id=None):resp = json_rpc('get_storage_full', [sess_id, sto_id, vol, num, sub_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:chaifen_stor(i)t = [str(x) for x in i.values()]obj = ','.join(t)a.append(obj)a = ';'.join(a)return '{0};{1};{2}'.format(0,len(resp['result']),a),def set_storage(sess_id, sto_id, vol=None, num=None, subs_id=None,):resp = json_rpc('set_storage', [sess_id, sto_id, vol, num, subs_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef del_storage(sess_id, sto_id):resp = json_rpc('del_storage', [sess_id, sto_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef add_article(sess_id, title, author, pageNum, sto_id, k1=None, k2=None, k3=None, k4=None, k5=None):resp = json_rpc('add_article', [sess_id, title, author, pageNum, sto_id, k1, k2, k3, k4, k5])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回int类型的art_iddef get_article(sess_id, art_id=None, title=None, author=None, pageNum=None, sto_id=None, k1=None, k2=None, k3=None, k4=None, k5=None):resp = json_rpc('get_article', [sess_id, art_id, title, author, pageNum, sto_id, k1, k2, k3, k4, k5])if 'error' in resp:#return '1,'+'0,'+str(resp['error']['code']),str(resp['error']['message']),return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:t = [str(x) for x in i.values()]obj = ','.join(t)a.append(obj)a = ';'.join(a)return '0;'+str(len(resp['result']))+';'+a,#返回文章项元组的列表def get_article_advanced(sess_id, art_id=None, title=None, author=None, pageNum=None, sto_id=None, keywords=None):resp = json_rpc('get_article_advanced', [sess_id, art_id, title, author, pageNum, sto_id, keywords])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:t = [str(x) for x in i.values()]obj = ','.join(t)a.append(obj)a = ';'.join(a)return '0;'+str(len(resp['result']))+';'+a,#返回文章项元组的列表def set_article(sess_id, art_id, title=None, author=None, pageNum=None, sto_id=None, k1=None, k2=None, k3=None, k4=None, k5=None):resp = json_rpc('set_article', [sess_id, art_id, title, author, pageNum, sto_id, k1, k2, k3, k4, k5])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef del_article(sess_id, art_id):resp = json_rpc('del_article', [sess_id, art_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef add_borrow(sess_id, user, sto_id, bt_year=None,bt_month=None,bt_day=None,at_year=None,at_month=None,at_day=None):bt = datetime(year=bt_year,month=bt_month,day=bt_day)at = datetime(year=at_year,month=at_month,day=at_day)rt=Noneresp = json_rpc('add_borrow', [sess_id, user, sto_id, bt, at, rt])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回int类型的bor_iddef checknone_fts(ob):if ob is None:return Nonet = datetime.fromtimestamp(ob)return '{},{},{},{},{},{}'.format(t.year,t.month,t.day,t.hour,t.minute,t.second)#return ','.join(t.year,t.month,t.day,t.hour,t.minute,t.second)#return datetime.fromtimestamp(ob)def get_borrow(sess_id, bor_id=None, user_id=None,sto_id=None, bt=None, at=None, rt=None):resp = json_rpc('get_borrow', [sess_id, bor_id,user_id, sto_id, bt, at, rt])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:#i['borrowtime'] = datetime.fromtimestamp(i['borrowtime'])#i['agreedtime'] = datetime.fromtimestamp(i['agreedtime'])#i['returntime'] = datetime.fromtimestamp(i['returntime'])i['borrowtime'] = checknone_fts(i['borrowtime'])i['agreedtime'] = checknone_fts(i['agreedtime'])i['returntime'] = checknone_fts(i['returntime'])t = [str(x) for x in i.values()]t = t[0:1]+t[4:]+t[1:4]obj = ','.join(t)a.append(obj)a = ';'.join(a)return '0;'+str(len(resp['result']))+';'+a,#返回借阅项元组的列表def chaifen_bor(obj):t=[str(x) for x in obj['user'].values()]t = ','.join(t)obj['user'] = tinobj = obj['storage']['subscribe']r=[str(x) for x in inobj['journal'].values()]r = ','.join(r)inobj['journal'] = rv=[str(x) for x in obj['storage']['subscribe'].values()]v = ','.join(v)obj['storage']['subscribe'] = vg = [str(x) for x in obj['storage'].values()]g = ','.join(g)obj['storage'] = gdef get_borrow_full(sess_id, bor_id=None, user_id=None,sto_id=None, bt=None, at=None, rt=None):resp = json_rpc('get_borrow_full', [sess_id, bor_id, user_id, sto_id, bt, at, rt])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),a = []for i in resp['result']:#i['borrowtime'] = datetime.fromtimestamp(i['borrowtime'])#i['agreedtime'] = datetime.fromtimestamp(i['agreedtime'])#i['returntime'] = datetime.fromtimestamp(i['returntime'])i['borrowtime'] = checknone_fts(i['borrowtime'])i['agreedtime'] = checknone_fts(i['agreedtime'])i['returntime'] = checknone_fts(i['returntime'])chaifen_bor(i)t = [str(x) for x in i.values()]t=t[0:1]+t[4:]+t[1:4]obj = ','.join(t)a.append(obj)a = ';'.join(a)return '0;'+str(len(resp['result']))+';'+a,def set_borrow(sess_id, bor_id=None, user=None, sto_id=None, bt=None, at=None, rt=None):resp = json_rpc('set_borrow', [sess_id, bor_id, user, sto_id, bt, at, rt])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef end_borrow(sess_id, bor_id):resp = json_rpc('end_borrow', [sess_id, bor_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回Nonedef new_datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0):#all intreturn datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second, microsecond=microsecond)#这个貌似没用了
def get_datetime(dt):dt.timetuple()t = [str(x) for x in dt.values()]obj = ','.join(t)return tdef del_borrow(sess_id, bor_id):resp = json_rpc('del_borrow', [sess_id, bor_id])if 'error' in resp:return str(resp['error']['code'])+';'+str(resp['error']['message']),return '0;'+str(resp['result']),#返回None

Qt C++调用Python,解决线程问题,以及GIL锁的处理相关推荐

  1. Qt(c++)调用python一直报错slot、hypot等

    最近在Qt里调用python代码,参考教程(https://blog.csdn.net/a137748099/article/details/119217197)引入python的include.li ...

  2. Qt Creator与Qt+VS2015调用Python代码的实现

    下面来介绍分别用Qt Creator与Qt+VS2015调用Python代码,首先电脑中要安装Python IDE与Qt.我电脑中安装的是Python37,VS2015+Qt5.8.Qt Creato ...

  3. Qt中调用Python,实现基础功能、绘图、界面实现和图片爬虫

    Qt中调用Python,实现基础功能.绘图.界面实现和图片爬虫

  4. 【Qt】Qt中调用python接口

    在Qt程序中调用python函数从步骤 1.在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/li ...

  5. VS2017 QT/C++ 调用python函数传图像

    原文:VS2019 C++ 调用python函数/类对象的方法_ 蜗牛在听雨的博客-CSDN博客_c++调用python函数 1.c++调用python类(传图像参数) ,编译出错,解决方法: 因为需 ...

  6. QT C++调用Python Py_Initialize 出错

    (先提醒一句,如果你用的python需要用到tensorflow的,还是别看了,下面装的是32位的python , 但是qt我又只能用32位的mingW版,这两个能兼容,可以运行.但是我python里 ...

  7. 【Qt】调用Python函数:无参数、单个参数、多个参数、数组参数

    一.链接配置 如果缺少头文件需要安装python3-dev: sudo apt-get install python3-dev 链接libpython3.4库,添加头文件路径,以Qt为例: INCLU ...

  8. TX2(Linux)在Qt中调用python函数

    实验环境:TX2使用JetPack-L4T-3.3-linux-x64_b39进行环境安装 详情参考:Jetpack3.3刷机 安装的python版本为3.5.2 1.创建Qt工程 在Qt中创建一个Q ...

  9. python中线程和进程_python中线程和进程的简单了解

    一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计算机得硬盘,让他们之间进行互相配合. 3 ...

  10. C++ 调用 Python 代码 - Clion QT混合编程 ,各取长处。

    Qt 自带编辑器 调用Python  Clion 编辑器    调用Python 前言:python 无所不能.代码简洁,易于维护,开发效率很快.就是运行速度太慢. C++速度快,但是开发繁琐,没有p ...

最新文章

  1. C 语言 结构体_finddata_t _findfirst, _findnext, _findclose 函数讲解
  2. 让bind函数支持IE8浏览器的方法
  3. shell `-c`参数 如何使用
  4. 密码(图解密码技术)_第二章_历史上的密码
  5. SSM项目使用GoEasy 实现web消息推送服务
  6. saprk randomSplit方法
  7. vue 获取跳转上一页组件信息
  8. VB.net小技巧系列目录
  9. FTP连接成功但是无法显示目录的解决方式
  10. 要素过多!精选100个酷炫API助你灵感爆棚
  11. Android市场变化令微软很受伤 专利授权收入锐减26%
  12. 全面屏/刘海屏及虚拟键适配--总结版
  13. 杰理之Dongle【篇】
  14. md5sum命令的灵活运用
  15. 石英晶振的发展趋势及应用
  16. MyEclipse安装Vue
  17. 动态规划表格法解决最长公共子序列(LCS)问题
  18. 导航栏个人中心增加宽度RiProV2主题美化日主题美化Ritheme主题美化
  19. [转]联想Y450笔记本Gentoo下配置无线网卡问题
  20. 结合CMMI体系的PMO组织建设研究--《PMO论文集2019》(电子版)

热门文章

  1. 区块链软件公司:你的区块链交易真的是匿名吗?
  2. 通过Keepalived实现Redis Failover自动故障切换功能[实践分享]
  3. android开发-01-搭建环境
  4. JAVA 内部类 泛型 实现堆栈
  5. 安装Exchange2007邮件系统
  6. sersync实现多台服务器实时同步文件
  7. HAProxy + Keepalived实现MySQL的高可用负载均衡
  8. URTracker 试用不过期修改方法
  9. HTML5-canvas标签
  10. php mpm,Ubuntu Apache 切换到php-fpm+mpm_event模式