Russian Qt Forum

Qt => Общие вопросы => Тема начата: panAlexey от Май 07, 2022, 08:22



Название: Проблема с QProcess, наверное?
Отправлено: panAlexey от Май 07, 2022, 08:22
Небольшой личный проект: https://github.com/trdm/sqlquery (https://github.com/trdm/sqlquery) используется для изучения английского.
Выглядит так: https://raw.githubusercontent.com/trdm/sqlquery/main/Doc/Screenshot_178.png

Проблема сидит в void TextEdit::doSelTextFormat()
Код:
void TextEdit::doSelTextFormat()
{
if (!QFile::exists(m_ExePath)) {
return;
}
QString vSel = textCursor().selectedText();
if (vSel.isEmpty()) {
return;
}
//QFile vFile(m_ExePath);
QString vExeFile = "SqlFormatter.exe";
QString vSqlFile = "SqlFormatter.sql";
QString vSqlFileС = "SqlFormatterС.sql";
QString vSqlFile2 = "SqlFormatter2.sql";
QString vSqlFile2p = " /o:SqlFormatter2.sql";
QString vBatFile = "SqlFormatter.bat";

QStringList vList = m_ExePath.split("/");
QStringList vList0 = m_ExePath.split("/");
vList0.removeAt(vList.size()-1);
QString vFolder = vList0.join("/");
vFolder.append("/");

//vList[vList.size()-1] = vBatFile;
QString vPathBat = vFolder; vPathBat.append(vBatFile);

vList[vList.size()-1] = vSqlFile;
QString vPathTxt = vList.join("/");
QString vPathTxtС = vList.join("/");

vList[vList.size()-1] = vSqlFile2;
QString vPathTxt2 = vList.join("/");

vList.removeAt(vList.size()-1);
QString vPathFolder = vList.join("/");
writeToFile(vPathTxt, vSel);
writeToFile(vPathBat, QString("SqlFormatter ").append(vSqlFile).append(vSqlFile2p),false);

QStringList arguments;
arguments << vSqlFile <<  vSqlFile2p;
//SqlFormatter test*.sql /o:resultfile.sql

QProcess myProcess; //= new QProcess(this);
myProcess.setWorkingDirectory(vPathFolder);
myProcess.start(vExeFile, arguments);
myProcess.waitForFinished(3000);
// if (!myProcess.waitForFinished())
// return;
QProcess::ProcessError err = myProcess.error();

myProcess.close();

vSel = loadFromFile(vPathTxt2);
if (!vSel.isEmpty()) {

QTextCursor cur = textCursor();
setTextCursor(cur);

//cur.removeSelectedText();
//insertPlainText(vSel);
//cur.insertText(vSel);

cur.beginEditBlock();
//cur.movePosition(QTextCursor::End);
QStringList string_list = vSel.split('\n');

for (int i = 0; i < string_list.size(); i++){
cur.insertText(string_list.at(i));
if ((i + 1) < string_list.size()){
cur.insertBlock();
}
}
cur.endEditBlock();
}
//qDebug() << vPathProc;
}
При исполнении этого кода прога фризится секунд на 5-10 и/или выдает неправильные результаты.
Для форматирования использую внешнюю утилиту из http://architectshack.com/PoorMansTSqlFormatter.ashx
ссыль на скачивание: http://architectshack.com/GetFile.aspx?Page=PoorMansTSqlFormatter&File=SqlFormatter.1.6.10.zip
Пожалуйста пните в нужном направлении. Функционал нужен :(

Предполагаю что SqlFormatter.exe ждет разблокировки файла с запросом? Но вроде как файло закрываю.
Код:
void TextEdit::writeToFile(QString &psPath, QString &psSrc, bool psUtf8)
{
QFile vSqlFile(psPath);
if (!vSqlFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
return;
}
QTextStream out(&vSqlFile);
if (psUtf8) {
out.setCodec("UTF-8");
}
out << psSrc /*<< "\n"*/;
out.flush();
vSqlFile.close();
}

Юзаю Qt4.8.7 + MSVC 9.0, Win 7


Название: Re: Проблема с QProcess, наверное?
Отправлено: qate от Май 07, 2022, 23:31
ставь логи, да хоть на каждой строке, пока не найдешь место фриза


Название: Re: Проблема с QProcess, наверное?
Отправлено: qtkoder777 от Май 07, 2022, 23:35
Небольшой личный проект:
Вы считаете, что разработанный Вами «язык», которым пишутся входные файлы для Вашей программы удобнее, чем промышленный язык SQL?

Чтоб ответить Вам по существу надо читать код Вашей программы, что при таком содержании делать никакого желания.

Напишите короткий тестовый пример и будем разбираться. Никаких внешних утилит быть не должно. Может в этой утилите и есть проблема.