Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как сделать, чтобы прога не висла?

3.8K
02 сентября 2006 года
CDhack 4.33
10 / / 29.08.2006
Значит есть прога. Я запускаю ей обработку, например, 20 гигов, и она это делает где-то минуту-две. В это время прога виснет, не разворачивается, если свернуть. Как сделать, чтобы она себя нормально вела?
354
02 сентября 2006 года
ШпиЁн
468 / / 19.02.2006
Вероятно ты запускаешь свою функцию прямо в обработчике нажатия кнопки(или подобного) :-)))) Проще сделать так: по нажатии кнопки создается поток, вся работа выполняется в потоке. При этом интерфейс виснут не будет! :-))))
1.9K
03 сентября 2006 года
SABROG
242 / / 26.01.2006
Чем мне не нравится работа с потоками, так это тем, что приходится везде ставить либо проверки на то, что поток выполняется уже или отключать часть кнопок перед потоком, а потом включать.
18K
03 сентября 2006 года
Leen
6 / / 17.07.2006
А куда деваться? Так или иначе приходится блокировать часть кнопок - чтобы юзеры не баловались. Можно написать простенькое РЕшоу и впихнуть ряд состояний. Еще метод (хоть и половинчатый) - на одну и ту же кнопку вешать 2 обратных функции... А TTimer запускается в своем потоке или использует тот же, что и остальные? Если в своем, то можно еще по нему как-то приостанавливать основной процесс. Или задробить данные на куски и обрабатывать по таймеру. Секундную задержку простить можно.. Нажал на кнопку, через секунду она сработала.
354
03 сентября 2006 года
ШпиЁн
468 / / 19.02.2006
ох уж этот builder! :-)))) можно ведь без всяких TThread, одной строчкой поток создать...
нечто типа:
Код:
bool bRunning = false; // глобальная переменная(работает поток или нет)
DWORD dwThId;
DWORD dwParam = 0;
.....
hThread = CreateThread(0, 0, Thread, &dwParam, 0, &dwThId); // где-то при нажатии кнопки
....

DWORD WINAPI Thread(LPVOID v)
{
bRunning = true;
.....  //выполняем все что нужно
bRunning = false;
return 1;
}


Разве это сложно? :-))))
1.9K
04 сентября 2006 года
Anton Chik
175 / / 26.09.2005
2CDHAck 4.33: пробовал вставлять в обработчик, который тормозит, что-то вроде Application->ProcessMessages(); ? это чтобы система "отвлекалась" на другие процессы и события, обычно вставаляют в главный цикл перебора...
332
05 сентября 2006 года
Valiant
416 / / 27.09.2004
открыл для себя мир потоков
эффективная оказалась штука :) и вам советуб товарисч
725
07 сентября 2006 года
UnErase
190 / / 08.06.2006
Не вижу в потоках ничего сложного, наоборот это очень удобно.

Как-то писал прогу, что-то наподобии TotalCommander, и мне очень сильно помогли потоки...

Вы сами представьте, если бы "Explorer" был сделан на таймере, вы бы лазили по нему с задержкой 1 сек..... :) Я представляю как бесились бы пользователи.
97K
22 января 2016 года
Andreyonka
1 / / 22.01.2016
Цитата: ШпиЁн
ох уж этот builder! :-)))) можно ведь без всяких TThread, одной строчкой поток создать...

Разве это сложно? :-))))

Спасибо огромное! Там маленькая ошибочка есть - не объявлен хэндл потока, но это мелочь по сравнению с идеей. Все чуточку сложнее создания обычной функции c++, хотя вопрос спорный. Потоки самого Builderа (TThread) мне тоже кажутся слишком замороченными.
Мой код рабочий из программы (в основе предложенный вариант исправленный, немного измененный, дополненный комментариями и готовый к выполнению):

Код:
bool bRunning = false; // глобальная переменная (работает поток или нет) - можно не делать
DWORD dwThId; // идентификатор потока (без него нельзя в старых версиях Windows)
// DWORD dwParam = 0;       // Если ничего передавать в поток не нужно, то переменная не нужна

// запустим все в потоке
DWORD WINAPI Thread(LPVOID v)
{
    // делаем что нужно
        bRunning = true;    // поток работает (можно не делать)

        int a = 1;
        int b = 2;
        int c;

        c = a + b;
 
        Form1->Memo1->Lines->Add("c =  " +  IntToStr(i+1)); // выведем в Memo формы 1 результат

        ShowMessage("Готово");        // отобразим сообщение, что работа завершена
        Form1->Button1->Enabled = true; //сделаем кнопку, запустившую поток актинвной
        bRunning = false;   // поток закончил работу (можно не делать)
    // заканчисваем делать что нужно

    return 1;
}

// отработчик нажатия кнопки
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // запустим поток
    //  HANDLE hThread = CreateThread(0, 0, Thread, &dwParam, 0, &dwThId); // где-то при нажатии кнопки
        //dwParam не используем, т.к. параметры не передаем в поток (NULL вместо него)
    HANDLE hThread = CreateThread(0, 0, Thread, NULL, 0, &dwThId);  // объявление выше было пропущено
    CloseHandle(hThread);   //закроем хэндл потока за ненадобностью
    Button1->Enabled = false;   // погасим кнопку, чтоб не запустить повторно
}
3.8K
22 января 2016 года
CDhack 4.33
10 / / 29.08.2006
Цитата: Andreyonka

Спасибо огромное! Там маленькая ошибочка есть - не объявлен хэндл процесса, но это мелочь по сравнению с идеей. Все чуточку сложнее создания обычной функции c++, хотя вопрос спорный. Потоки самого Builderа (TThread) мне тоже кажутся слишком замороченными.
Мой код рабочий из программы (в основе предложенный вариант исправленный, немного измененный, дополненный комментариями и готовый к выполнению):

Спасибо, братишка, наконец-то заработало!

7
23 января 2016 года
@pixo $oft
3.4K / / 20.09.2006
Как хорошо, что хотя бы через 9.5 лет это кому-то помогло!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог