Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Зависает кнопка при вызове потока
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Buratino
При выполнении потока по нажатию кнопки, сама кнопка зависает, и невозможно выполнение никаких других действий до завершения всех действий в потоке, что я не так делаю?

Код Unit2.сpp потока :
Код
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Windows.h"
#include "math.h"
#pragma package(smart_init)
#define pi 3.1415926


__fastcall Ready::Ready(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall Ready::Execute()
{

Synchronize(Graph);

//---- Place thread code here ----
}

void __fastcall Ready::Graph(void)   //определение cозданной функции
{
    for (int i = 0; i < 1000; i++)
        {
           Form1->Memo2->Lines->Add(sin(i));
           Sleep(2000);
         }
}


Unit2.h:
Код
class Ready : public TThread
{
private:
protected:
    void __fastcall Execute();
public:
    TMemo *Memo2; //объект мемо
    void __fastcall Graph();
    __fastcall Ready(bool CreateSuspended); //объявление исполняемой функции
};


код обработчика кнопки Button2 Unit1.cpp:
Код
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Thread = new Ready(false); //cоздал объект класса TThread (Ready)
Thread->FreeOnTerminate = true; //разрушаем объект после окончания выполнения
Thread->Priority = tpLower; //задал приоритет
}
demiurg_spb
помнится, чтобы гуй не зависал, в долгие циклы я вставлял вызов
Код
Application->ProcessMessages();
не уверен, что это нужно делать в другом трэде.
AHTOXA
Цитата(Buratino @ Oct 8 2013, 15:38) *
При выполнении потока по нажатию кнопки, сама кнопка зависает, и невозможно выполнение никаких других действий до завершения всех действий в потоке, что я не так делаю?


Synchronize(Graph); - выполняет процедуру Graph в контексте главного потока. Естественно, главный поток подвисает на всё время выполнения.
Сделайте иначе:
Код
void __fastcall Ready::Execute()
{
    for (int i = 0; i < 1000; i++)
        {
           FPoint = i;
           Synchronize(AddPoint);
           Sleep(2000);
         }
}

void __fastcall Ready::AddPoint(void)
{
           Form1->Memo2->Lines->Add(sin(FPoint));
}
Buratino
Цитата
помнится, чтобы гуй не зависал, в долгие циклы я вставлял вызов


Вставил в цикл и поехало! sm.gif Только ,правда, прога притормаживает неплохо так smile3046.gif laugh.gif


AHTOXA Переделал по Вашему образцу, теперь всё чётко работает, спасибо! disco.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.