реклама на сайте
подробности

 
 
> Зависает кнопка при вызове потока, c++ builder
Buratino
сообщение Oct 8 2013, 09:38
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



При выполнении потока по нажатию кнопки, сама кнопка зависает, и невозможно выполнение никаких других действий до завершения всех действий в потоке, что я не так делаю?

Код 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; //задал приоритет
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
demiurg_spb
сообщение Oct 8 2013, 10:32
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



помнится, чтобы гуй не зависал, в долгие циклы я вставлял вызов
Код
Application->ProcessMessages();
не уверен, что это нужно делать в другом трэде.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 8 2013, 10:53
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(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));
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Buratino
сообщение Oct 8 2013, 10:54
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



Цитата
помнится, чтобы гуй не зависал, в долгие циклы я вставлял вызов


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


AHTOXA Переделал по Вашему образцу, теперь всё чётко работает, спасибо! disco.gif

Сообщение отредактировал Buratino - Oct 8 2013, 10:59
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016