Russian Qt Forum
Ноябрь 01, 2024, 04:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: Трудоемкие задачи (прервать или продолжить). Как прервать?  (Прочитано 33398 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Декабрь 07, 2009, 10:56 »

Изначально вопрос был
Как на момент выполнения трудоемкой задачи заблокировать сигналы от кнопок, закрытие окна.....?
Это решается несколькими способами, например очень хорошо смотрится QProgressDialog. Вот старая но хорошая ссылочка http://www.opennet.ru/docs/RUS/qt3_prog/x4064.html

daimon, все что Вам нужно это переписать текст из примера (или выложите ф-цию, я добавлю текст). Это займет 5 минут и совершенно незачем вдаваться в нюансы потоков и.т.п. Это не имеет к Вашей задаче никакого отношения.
« Последнее редактирование: Декабрь 07, 2009, 11:04 от Igors » Записан
daimon
Гость
« Ответ #31 : Декабрь 07, 2009, 20:47 »

Изначально вопрос был
Как на момент выполнения трудоемкой задачи заблокировать сигналы от кнопок, закрытие окна.....?
Это решается несколькими способами, например очень хорошо смотрится QProgressDialog. Вот старая но хорошая ссылочка http://www.opennet.ru/docs/RUS/qt3_prog/x4064.html

daimon, все что Вам нужно это переписать текст из примера (или выложите ф-цию, я добавлю текст). Это займет 5 минут и совершенно незачем вдаваться в нюансы потоков и.т.п. Это не имеет к Вашей задаче никакого отношения.

Код
C++ (Qt)
bool Spreadsheet::sort_data_with_GUI(const QList<QTableWidgetSelectionRange>& range)
{
if(range.isEmpty())
{return false;}
else
{
for(int it=0;it<range.size();it++)
{
if(range[it].leftColumn()<0||range[it].bottomRow()<0||range[it].rightColumn()<0||range[it].topRow()<0)
{process=0;return false;}
qApp->processEvents();
}
QString error="";
 
for(int it=0;it<range.size();it++)
for(int i=0;i<range[it].rowCount();i++)
for(int j=0;j<range[it].columnCount();j++)
{
 
 
 
if(!item(range[it].topRow()+i ,range[it].leftColumn()+j)||item(range[it].topRow()+i ,range[it].leftColumn()+j)->text()=="")
{error+=tr("item: ")+get_header_label(range[it].leftColumn()+j)+QString::number(range[it].topRow()+i+1)+tr(" - not value\n");}
}
 
if(error!="")
{
QMessageBox  *errorMessageDialog = new QMessageBox(this);
 
errorMessageDialog->setWindowTitle(tr(""));
errorMessageDialog->setText(tr("Invalid item(s) ( ? select Item with valid value)."));
errorMessageDialog->setIcon(QMessageBox::Critical);
 
 
  errorMessageDialog->setDetailedText(error);
 
errorMessageDialog->show();
process=0;return false;
}
 
else
{
 
Dialog_properties_datasheet_sort dialog;
 
QStringList interval_names_for_columns;
 
for(int it=0;it<range.size();it++)
for(int i=range[it].leftColumn();i<=range[it].rightColumn();i++)
{
if(interval_names_for_columns.indexOf(list_names_for_columns ()[i])==-1)interval_names_for_columns+=list_names_for_columns ()[i];qApp->processEvents();}
 
dialog.setColumnRange(interval_names_for_columns);
 
if (dialog.exec())
{
if( !sort_data(range,dialog.get_settings_for_compare_from_dialog()))
{
QMessageBox::information(this,tr("Graphbuilder"),tr("Sort nothing has changed"));
return false;
}
}
return true;
}
}
}
 
}
 
 
 
 
bool Spreadsheet::sort_data(const QList<QTableWidgetSelectionRange>& range, const SpreadsheetCompare &compare)
{
 
if(range.isEmpty())
{return false;}
else
{
for(int it=0;it<range.size();it++)
{
if(range[it].leftColumn()<0||range[it].bottomRow()<0||range[it].rightColumn()<0||range[it].topRow()<0)
{return false;}
qApp->processEvents();
}
 
 
 
 
 
 
QList<int> columns;
QList<int> rows_n;
for(int i=0;i<range.size();i++)
{
for(int col=range[i].leftColumn();col<=range[i].rightColumn();col++)
 
{if(columns.indexOf(col) ==-1) columns.push_back(col);qApp->processEvents();}
for(int row=range[i].topRow();row<=range[i].bottomRow();row++)
{if(rows_n.indexOf(row) ==-1) rows_n.push_back(row);qApp->processEvents();}
}
qSort(columns.begin(),columns.end());
 
qSort(rows_n.begin(),rows_n.end());
 
QList<QStringList> rows;
 
 
 
for(int i=0;i<rows_n.size();i++)
 
{
QStringList row;
 
for(int j=0;j<columns.size();j++)
{
 
if(is_item_in_list_selection_range(range, rows_n[i],  columns[j])==true )
{
if(isError_in_cell(rows_n[i],columns[j])==true)
{return false;}
else if(item(rows_n[i],columns[j]))
{
 
row.push_back(formula(rows_n[i],columns[j]));
}
qApp->processEvents();
}
}
if(row.size()==columns.size()&&row.size()>0)
rows.push_back(row);
 
else
{
rows_n.removeOne(rows_n[i]);
i--;
}
row.clear();
}
 
 
QList<QStringList> temp=rows;
qStableSort(rows.begin(), rows.end(),compare);
 
if(rows==temp) {process=0;return false;}
for(int i=0;i<rows.size();i++)
 
{
 
 
for(int j=0;j<rows[i].size();j++)
{
 
setFormula(rows_n[i], columns[j], rows[i][j]);
qApp->processEvents();
 
}
 
 
}
 
 
 
 
 
 
 somethingChanged();
 
 
return true;
}
 
}

Это две самые страшные функции одна вызывает другую (запускаю слот sort_data_with_GUI(const QList<QTableWidgetSelectionRange>& range) (1 из функций) из mainWindow)
Спасибо за ссылку, хорошо для одного цикла в функции, а как быть с разными операциями в функции

Задача изначально была такова- выполняется функция (долгая операция), если пользователь запускает на выполнение другую операцию выводится сообщение: "Прервать или продолжить?", тоже самое и при закрытии окна при выполнении задачи. При подтверждении прерывания желательно было бы откатить то, что сделала функция (не обязательно), а так прервать выполнение функции; продолжить - продолжение выполнение той задачи. Заранее большое спасибо, хочу сделать просто хорошее приложение (обработать все возможные нюансы).
« Последнее редактирование: Декабрь 07, 2009, 20:55 от daimon » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Декабрь 07, 2009, 21:39 »

Это две самые страшные функции одна вызывает другую (запускаю слот sort_data_with_GUI(const QList<QTableWidgetSelectionRange>& range) (1 из функций) из mainWindow)
Спасибо за ссылку, хорошо для одного цикла в функции, а как быть с разными операциями в функции

Задача изначально была такова- выполняется функция (долгая операция), если пользователь запускает на выполнение другую операцию выводится сообщение: "Прервать или продолжить?", тоже самое и при закрытии окна при выполнении задачи. При подтверждении прерывания желательно было бы откатить то, что сделала функция (не обязательно), а так прервать выполнение функции; продолжить - продолжение выполнение той задачи. Заранее большое спасибо, хочу сделать просто хорошее приложение (обработать все возможные нюансы).
Объясните ЗАЧЕМ Вы даете пользователю возможность что-то нажимать если текущая операция не закончена? Все гораздо проще, не придумывайте себе проблем. Началась трудоемкая операция - покажите индикатор QProgressDialog. А поскольку он модальный (см. ссылку) то единственное что пользователь может сделать - нажать cancel и Вы легко это можете отловить (см. ту же ссылку). Все остальное будет зажато модальностью индикатора. Надо переспросить пользователя - не проблема, породитесь от QProgressDialog. Надо откатить операцию - у Вас все на руках, одно удовольствие. Не лезьте в асинхронку, потом полжизни на аптеку будете работать  Улыбающийся
Записан
daimon
Гость
« Ответ #33 : Декабрь 07, 2009, 21:51 »

Это две самые страшные функции одна вызывает другую (запускаю слот sort_data_with_GUI(const QList<QTableWidgetSelectionRange>& range) (1 из функций) из mainWindow)
Спасибо за ссылку, хорошо для одного цикла в функции, а как быть с разными операциями в функции

Задача изначально была такова- выполняется функция (долгая операция), если пользователь запускает на выполнение другую операцию выводится сообщение: "Прервать или продолжить?", тоже самое и при закрытии окна при выполнении задачи. При подтверждении прерывания желательно было бы откатить то, что сделала функция (не обязательно), а так прервать выполнение функции; продолжить - продолжение выполнение той задачи. Заранее большое спасибо, хочу сделать просто хорошее приложение (обработать все возможные нюансы).
Объясните ЗАЧЕМ Вы даете пользователю возможность что-то нажимать если текущая операция не закончена? Все гораздо проще, не придумывайте себе проблем. Началась трудоемкая операция - покажите индикатор QProgressDialog. А поскольку он модальный (см. ссылку) то единственное что пользователь может сделать - нажать cancel и Вы легко это можете отловить (см. ту же ссылку). Все остальное будет зажато модальностью индикатора. Надо переспросить пользователя - не проблема, породитесь от QProgressDialog. Надо откатить операцию - у Вас все на руках, одно удовольствие. Не лезьте в асинхронку, потом полжизни на аптеку будете работать  Улыбающийся
Как распределить показание прогрессдиалога? Может условно поделить свою функции на проценты выполнения
Записан
daimon
Гость
« Ответ #34 : Декабрь 07, 2009, 21:57 »

Можна как-то обойтись именно в функции без прогрессдиалога и светить после выполнения части задачи сигналом value
А в функции, которая вызвала этот слот сделать connect с этим сигналом value и соединить с прогрессдиалогом на вывод текущего прогресса. Но тут проблема как прервать работу той страшной функции в слоте с коннектом.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Декабрь 07, 2009, 22:19 »

Можна как-то обойтись именно в функции без прогрессдиалога и светить после выполнения части задачи сигналом value
А в функции, которая вызвала этот слот сделать connect с этим сигналом value и соединить с прогрессдиалогом на вывод текущего прогресса. Но тут проблема как прервать работу той страшной функции в слоте с коннектом.
Зачем "обходиться" без вещи которая делает именно то что Вам нужно? QProgressDialog уже "светит", просто давайте ему setProgress (см. ссылку)

Как распределить показание прогрессдиалога? Может условно поделить свою функции на проценты выполнения
Объявите в начале ф-ции QProgressDialog progress. К каждому processEvents в Ваших ф-циях добавьте:
Код:
 progress.setProgress(it);
..
 qApp->processEvents();
 if (progress.wasCanceled()) {
      return false;
 }
Сделайте это, потом задавайте очередные вопросы (если они возникнут).
Записан
daimon
Гость
« Ответ #36 : Декабрь 08, 2009, 01:55 »

Можна как-то обойтись именно в функции без прогрессдиалога и светить после выполнения части задачи сигналом value
А в функции, которая вызвала этот слот сделать connect с этим сигналом value и соединить с прогрессдиалогом на вывод текущего прогресса. Но тут проблема как прервать работу той страшной функции в слоте с коннектом.
Зачем "обходиться" без вещи которая делает именно то что Вам нужно? QProgressDialog уже "светит", просто давайте ему setProgress (см. ссылку)

Как распределить показание прогрессдиалога? Может условно поделить свою функции на проценты выполнения
Объявите в начале ф-ции QProgressDialog progress. К каждому processEvents в Ваших ф-циях добавьте:
Код:
 progress.setProgress(it);
..
 qApp->processEvents();
 if (progress.wasCanceled()) {
      return false;
 }
Сделайте это, потом задавайте очередные вопросы (если они возникнут).

Разбил функцию условно на 6 частей и через часть вывожу по +17%
Я не знаю в каком моменте -строке функции пользователь нажмёт cancel. Как мне обработать cancel? Можна через соединение сигнал-слот, но как я прерву работу функции через другой слот?
Код
C++ (Qt)
bool Spreadsheet::sort_data(const QList<QTableWidgetSelectionRange>& range, const SpreadsheetCompare &compare)
{
 
if(range.isEmpty())
{return false;}
else
{
QProgressDialog *p_d=new QProgressDialog(this);
 
connect(p_d, SIGNAL(canceled()),  this,SLOT(?????return 0));/////////////////////////////////
p_d->setMinimumDuration(1);
 
for(int it=0;it<range.size();it++)
{
if(range[it].leftColumn()<0||range[it].bottomRow()<0||range[it].rightColumn()<0||range[it].topRow()<0)
{return false;}
qApp->processEvents();
}
 
p_d->setValue(17);/////////////////////////////////////////////////////////////////////
 
 
 
 
QList<int> columns;
QList<int> rows_n;
for(int i=0;i<range.size();i++)
{
for(int col=range[i].leftColumn();col<=range[i].rightColumn();col++)
 
{if(columns.indexOf(col) ==-1) columns.push_back(col);qApp->processEvents();}
for(int row=range[i].topRow();row<=range[i].bottomRow();row++)
{if(rows_n.indexOf(row) ==-1) rows_n.push_back(row);qApp->processEvents();}
}
p_d->setValue(34);///////////////////////////////////////////////////////////////////////////////////////
qSort(columns.begin(),columns.end());
p_d->setValue(51);////////////////////////////////////////////////////////////////////////////////////
qSort(rows_n.begin(),rows_n.end());
 
QList<QStringList> rows;
 
 
 
for(int i=0;i<rows_n.size();i++)
 
{
QStringList row;
 
for(int j=0;j<columns.size();j++)
{
 
if(is_item_in_list_selection_range(range, rows_n[i],  columns[j])==true )
{
if(isError_in_cell(rows_n[i],columns[j])==true)
{process=0;return false;}
else if(item(rows_n[i],columns[j]))
{
 
row.push_back(text(rows_n[i],columns[j]));
}
qApp->processEvents();
}
}
if(row.size()==columns.size()&&row.size()>0)
rows.push_back(row);
 
else
{
rows_n.removeOne(rows_n[i]);
i--;
}
row.clear();
}
 
p_d->setValue(68);//////////////////////////////////////////////////////////////
QList<QStringList> temp=rows;
qStableSort(rows.begin(), rows.end(),compare);
p_d->setValue(85);/////////////////////////////////////////////////////////////
if(rows==temp) {return false;}
for(int i=0;i<rows.size();i++)
 
{
 
 
for(int j=0;j<rows[i].size();j++)
{
 
setItem(rows_n[i], columns[j], rows[i][j]);
qApp->processEvents();
 
}
 
p_d->setValue((i*10)/rows.size()+85);//////////////////////////////////////
}
 
 
 
 
 
p_d->setValue(95);/////////////////////////////////////////////////
 //  clearSelection();
somethingChanged();
p_d->setValue(100);/////////////////////////////////////////
 
return true;
}
 
}
« Последнее редактирование: Декабрь 08, 2009, 01:59 от daimon » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Декабрь 08, 2009, 15:04 »

Can you read or only write? Улыбающийся

Вам говорили что диалог должен быть модальным? Просто слушайте и понимайте - и массы вопросов не возникнет. Не надо ничего разбивать, просто заряжайте индикатор для каждой операции, например

Код:
#define UPDATE_STEP	100

bool UpdateProgress( QProgressDialog & progress, int row )
{
if ((row + 1) % UPDATE_STEP) return true; // update once per UPDATE_STEP
progress.setValue(row); // calls processEvents for modal dialog
return progress.wasCanceled();
}

bool Spreadsheet::sort_data( const QList<QTableWidgetSelectionRange> & range, const SpreadsheetCompare & compare )
{
if(range.isEmpty()) return false;

QProgressDialog progress(this);
progess.setModal(true); // should be modal

// check range
progress.setLabelText(tr("Checking range"));
progress.setMaximum(range.size());
for (int it = 0; it < range.size(); it++) {
if (range[it].leftColumn() < 0) return false;
if (range[it].bottomRow() < 0) return false;
if (range[it].rightColumn() < 0) return false;
if (range[it].topRow() < 0) return false;
if (!UpdateProgress(progress, it)) return false;
}

// fill columns
QList<int> columns;
QList<int> rows_n;

progress.setLabelText(tr("Adding rows & columns"));
progress.setMaximum(range.size());
progress.setValue(0);
for(int i = 0; i < range.size(); i++) {
for (int col = range[i].leftColumn(); col <= range[i].rightColumn(); col++)
  if (columns.indexOf(col) == -1) columns.push_back(col);

for(int row = range[i].topRow(); row <= range[i].bottomRow(); row++)
if (rows_n.indexOf(row) == -1) rows_n.push_back(row);

if (!UpdateProgress(progress, i)) return false;
}

// sort
progress.setLabelText(tr("Sorting"));
progress.setMaximum(2);
progress.setValue(0);
qSort(columns.begin(), columns.end());
qSort(rows_n.begin(), rows_n.end());

// add
progress.setLabelText(tr("Adding rows & columns"));
progress.setMaximum(rows_n.size());
progress.setValue(0);
QList<QStringList> rows;
for(int i = 0; i < rows_n.size(); i++) {
if (!UpdateProgress(progress, i)) return false;
QStringList row;
for (int j = 0; j < columns.size(); j++) {
  if (is_item_in_list_selection_range(range, rows_n[i], columns[j])) {
if (isError_in_cell(rows_n[i], columns[j]))
return false;
if (item(rows_n[i], columns[j]))
  row.push_back(text(rows_n[i], columns[j]));
}
}

if (row.size() == columns.size() && row.size() > 0)
rows.push_back(row);
else {
rows_n.removeOne(rows_n[i]);
i--;
}
row.clear();
}

QList<QStringList> temp = rows;
qStableSort(rows.begin(), rows.end(), compare);
if (rows == temp) return false;

// set items
progress.setLabelText(tr("Setting Items"));
progress.setMaximum(rows.size());
progress.setValue(0);
for (int i = 0; i < rows.size(); i++) {
if (!UpdateProgress(progress, i)) return false;
for(int j = 0; j < rows[i].size(); j++)
setItem(rows_n[i], columns[j], rows[i][j]);
}
 
return true;
}
Записан
daimon
Гость
« Ответ #38 : Декабрь 08, 2009, 23:33 »

Огромное спасибо буду пробовать Смеющийся
Записан
daimon
Гость
« Ответ #39 : Декабрь 09, 2009, 22:45 »

Can you read or only write? Улыбающийся

Вам говорили что диалог должен быть модальным? Просто слушайте и понимайте - и массы вопросов не возникнет. Не надо ничего разбивать, просто заряжайте индикатор для каждой операции, например

Код:
#define UPDATE_STEP	100

bool UpdateProgress( QProgressDialog & progress, int row )
{
if ((row + 1) % UPDATE_STEP) return true; // update once per UPDATE_STEP
progress.setValue(row); // calls processEvents for modal dialog
return progress.wasCanceled();
}

bool Spreadsheet::sort_data( const QList<QTableWidgetSelectionRange> & range, const SpreadsheetCompare & compare )
{
if(range.isEmpty()) return false;

QProgressDialog progress(this);
progess.setModal(true); // should be modal

// check range
progress.setLabelText(tr("Checking range"));
progress.setMaximum(range.size());
for (int it = 0; it < range.size(); it++) {
if (range[it].leftColumn() < 0) return false;
if (range[it].bottomRow() < 0) return false;
if (range[it].rightColumn() < 0) return false;
if (range[it].topRow() < 0) return false;
if (!UpdateProgress(progress, it)) return false;
}

// fill columns
QList<int> columns;
QList<int> rows_n;

progress.setLabelText(tr("Adding rows & columns"));
progress.setMaximum(range.size());
progress.setValue(0);
for(int i = 0; i < range.size(); i++) {
for (int col = range[i].leftColumn(); col <= range[i].rightColumn(); col++)
  if (columns.indexOf(col) == -1) columns.push_back(col);

for(int row = range[i].topRow(); row <= range[i].bottomRow(); row++)
if (rows_n.indexOf(row) == -1) rows_n.push_back(row);

if (!UpdateProgress(progress, i)) return false;
}

// sort
progress.setLabelText(tr("Sorting"));
progress.setMaximum(2);
progress.setValue(0);
qSort(columns.begin(), columns.end());
qSort(rows_n.begin(), rows_n.end());

// add
progress.setLabelText(tr("Adding rows & columns"));
progress.setMaximum(rows_n.size());
progress.setValue(0);
QList<QStringList> rows;
for(int i = 0; i < rows_n.size(); i++) {
if (!UpdateProgress(progress, i)) return false;
QStringList row;
for (int j = 0; j < columns.size(); j++) {
  if (is_item_in_list_selection_range(range, rows_n[i], columns[j])) {
if (isError_in_cell(rows_n[i], columns[j]))
return false;
if (item(rows_n[i], columns[j]))
  row.push_back(text(rows_n[i], columns[j]));
}
}

if (row.size() == columns.size() && row.size() > 0)
rows.push_back(row);
else {
rows_n.removeOne(rows_n[i]);
i--;
}
row.clear();
}

QList<QStringList> temp = rows;
qStableSort(rows.begin(), rows.end(), compare);
if (rows == temp) return false;

// set items
progress.setLabelText(tr("Setting Items"));
progress.setMaximum(rows.size());
progress.setValue(0);
for (int i = 0; i < rows.size(); i++) {
if (!UpdateProgress(progress, i)) return false;
for(int j = 0; j < rows[i].size(); j++)
setItem(rows_n[i], columns[j], rows[i][j]);
}
 
return true;
}
Как по мне надо сделать маленькие изменения
Код
C++ (Qt)
if ((row+1 ) % UPDATE_STEP) return false;
if (UpdateProgress(progress, it)) return false; каждую проверку заменить
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #40 : Декабрь 09, 2009, 23:00 »

Как по мне надо сделать маленькие изменения
Код
C++ (Qt)
if ((row+1 ) % UPDATE_STEP) return false;
if (UpdateProgress(progress, it)) return false; каждую проверку заменить
Почему нет? Но тогда измените название - не UpdateProgress, а, например, UserCancel.

И еще: не прессуйте текст типа (row+1) - это выглядит как зажатый зародыш в утробе матери Улыбающийся Что Вам, пробелов жалко? Пишите со вкусом, покажите всем что Вы хотели сказать, не жмитесь к стенке Улыбающийся
Записан
daimon
Гость
« Ответ #41 : Декабрь 10, 2009, 00:37 »

У меня в конце той страшной функции вызывается функция  somethingChanged(), которая тоже долго вычисляется. Как тогда быть в таком случае с прогресс диалогом (проверкой на отмену)? Ну например ещё qSort...
UpdateProgress(progress, i)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #42 : Декабрь 10, 2009, 01:13 »

У меня в конце той страшной функции вызывается функция  somethingChanged(), которая тоже долго вычисляется. Как тогда быть в таком случае с прогресс диалогом (проверкой на отмену)? Ну например ещё qSort...
UpdateProgress(progress, i)
Ну и подайте ей progress (QProgressDialog) как аргумент, напр. опишите ее так
Код:
bool somethingChanged( QProgressDialog & progress );

// вызов
if (!somethingChanged(progress)) return false;

А внутри ф-ции работайте в том же стиле, заряжайте индикатор и все дела. Насчет сортировки - да, это не обновит индикатор, ну так что с того - не все операции могут быть прерваны, это нормально. И вообще, что это за философия такая "страшная ф-ция" и.т.п? Это они должны Вас бояться а не Вы их Улыбающийся
Записан
daimon
Гость
« Ответ #43 : Декабрь 10, 2009, 01:26 »

У меня в конце той страшной функции вызывается функция  somethingChanged(), которая тоже долго вычисляется. Как тогда быть в таком случае с прогресс диалогом (проверкой на отмену)? Ну например ещё qSort...
UpdateProgress(progress, i)
Ну и подайте ей progress (QProgressDialog) как аргумент, напр. опишите ее так
Код:
bool somethingChanged( QProgressDialog & progress );

// вызов
if (!somethingChanged(progress)) return false;
А внутри ф-ции работайте в том же стиле, заряжайте индикатор и все дела. Насчет сортировки - да, это не обновит индикатор, ну так что с того - не все операции могут быть прерваны, это нормально. И вообще, что это за философия такая "страшная ф-ция" и.т.п? Это они должны Вас бояться а не Вы их Улыбающийся

Страшная функция - не оптимизирована страшно, краткая характеристика. Думаю как упрастить.
Что можна заменить на более быстродействующее?
Смысл работы: передаю список выделений итемов, составляю список выделенных колонок и строк; по этому списку формирую список итемов для сортировки, сортирую полученный список и устанавливаю эти итемы в выделенные колонки/строки. Списков много, как уменьшить. Преимущество такой сортировки ячеек для таблицы - могу сортировать разные колонки, находящиеся не рядом (поэтому и список выделений selectionRange) и могу выделять ячейки с помощью Ctrl , недостатки для колонки 10000 итемов сортирует долго
Кто чем может помогите? Грустный
« Последнее редактирование: Декабрь 10, 2009, 02:07 от daimon » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Декабрь 10, 2009, 11:45 »

Страшная функция - не оптимизирована страшно, краткая характеристика. Думаю как упрастить.
Что можна заменить на более быстродействующее?
Смысл работы: передаю список выделений итемов, составляю список выделенных колонок и строк; по этому списку формирую список итемов для сортировки, сортирую полученный список и устанавливаю эти итемы в выделенные колонки/строки. Списков много, как уменьшить. Преимущество такой сортировки ячеек для таблицы - могу сортировать разные колонки, находящиеся не рядом (поэтому и список выделений selectionRange) и могу выделять ячейки с помощью Ctrl , недостатки для колонки 10000 итемов сортирует долго
Кто чем может помогите? Грустный
10 тысяч итемов - для сортировки не объем, если Вы сортируете грамотно это должно выполняться за доли секунды. Для начала проверьте что все списки/контейнеры подаются по ссылке. Не поможет - выкладывайте Вашу "страшную ф-цию", будем смотреть.
Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.177 секунд. Запросов: 23.