Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Остановка потоков, Не работает остановка потоков 
:(
    Опции темы
DDA04
Дата 30.10.2013, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.5.2013

Репутация: нет
Всего: нет



Ребята помогите пожалуйста, не могу разобраться с остановкой потоков. Вроде при нажатии на кнопку поток должен переходить в состояние паузы. Что не так, или что явно что-то не понимаю.

Unit1.cpp
Код


#include <vcl.h>
#include <math.h>
#include <conio.h>

#include <iostream.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

int N = 10000;
int nPotok;
IvanovP1 *P1;
IvanovP2 *P2;
IvanovP3 *P3;
IvanovP4 *P4;
IvanovP5 *P5;
TThreadPriority MyPriority[5] = {tpLowest,tpLower,tpNormal,tpHigher,tpHighest};
//-------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//-------------------------------
__fastcall IvanovP1::IvanovP1(bool CreateSuspended):TThread(CreateSuspended)
{
 FreeOnTerminate = false;
}
//-------------------------------
__fastcall IvanovP2::IvanovP2(bool CreateSuspended):TThread(CreateSuspended)
{
 FreeOnTerminate = false;
}

//-------------------------------
__fastcall IvanovP3::IvanovP3(bool CreateSuspended):TThread(CreateSuspended)
{
 FreeOnTerminate = false;
}
//-------------------------------
__fastcall IvanovP4::IvanovP4(bool CreateSuspended):TThread(CreateSuspended)
{
 FreeOnTerminate = false;
}
//-------------------------------
__fastcall IvanovP5::IvanovP5(bool CreateSuspended):TThread(CreateSuspended)
{
 FreeOnTerminate = false;
}
//-------------------------------
void __fastcall IvanovP1::Execute()
{

 float s = 0;
 for(int i=0;i<N;i++){
   s+= sin(i) + cos(i);

   Form1->ProgressBar1->Position = i;
   if(Terminated)goto a1;
   // Sleep(1);
      }
a1:; Fa = s;

}
//-------------------------------
void __fastcall IvanovP2::Execute()
{
 float s = 0;
 for(int i=0;i<N;i++){
   s+= cos(i);
   Form1->ProgressBar2->Position = i;
   if(Terminated) goto a1;


 }
a1:; Fb = s;

}
//-------------------------------

void __fastcall IvanovP3::Execute()
{
 float s = 0;
 for(int i=0;i<N;i++){
   s+= sin(i)+i;
   Form1->ProgressBar3->Position = i;
   if(Terminated) goto a1;


 }
a1:; Fc = s;

}
//-------------------------------

void __fastcall IvanovP4::Execute()
{
 float s = 0;
 for(int i=1;i<N+1;i++){
   s+= (cos(i)/i);
   Form1->ProgressBar4->Position = i;
   if(Terminated) goto a1;

 }
a1:; Fd = s;

}
//-------------------------------

void __fastcall IvanovP5::Execute()
{
 float s = 0;
 for(int i=0;i<N;i++){
   s+= sin(i);
   Form1->ProgressBar5->Position = i;
   if(Terminated) goto a1;

 }
a1:; Fe = s;

}
//-------------------------------
void __fastcall TForm1::ThreadDone(TObject *Sender)
{
 nPotok --;
 if(nPotok == 0) Label1->Caption = FloatToStr(P1->Fa + P2->Fb + P3->Fc + P4->Fd + P5->Fe);
}
//-------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 for(int i=0;i<5;i++){
   ComboBox1->Items->Append(MyPriority[i]);
   ComboBox2->Items->Append(MyPriority[i]);
   ComboBox3->Items->Append(MyPriority[i]);
   ComboBox4->Items->Append(MyPriority[i]);
   ComboBox5->Items->Append(MyPriority[i]);
 }
 ComboBox1->ItemIndex = 2;
 ComboBox2->ItemIndex = 2;
  ComboBox3->ItemIndex = 2;
   ComboBox4->ItemIndex = 2;
    ComboBox5->ItemIndex = 2;

}
//-------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  nPotok = 5;
  ProgressBar1->Max = N;      ProgressBar2->Max = N;       ProgressBar3->Max = N;     ProgressBar4->Max = N;     ProgressBar5->Max = N;
  ProgressBar1->Position = 0; ProgressBar2->Position = 0;  ProgressBar3->Position = 0;    ProgressBar4->Position = 0;    ProgressBar5->Position = 0;
  ProgressBar1->Step = 1;     ProgressBar2->Step = 1;      ProgressBar3->Step = 1;     ProgressBar4->Step = 1;            ProgressBar5->Step = 1;

  P1 = new IvanovP1(true);
  P2 = new IvanovP2(true);
  P3 = new IvanovP3(true);
  P4 = new IvanovP4(true);
  P5 = new IvanovP5(true);

  P1->Priority = MyPriority[ComboBox1->ItemIndex];
  P2->Priority = MyPriority[ComboBox2->ItemIndex];
  P3->Priority = MyPriority[ComboBox3->ItemIndex];
  P4->Priority = MyPriority[ComboBox4->ItemIndex];
  P5->Priority = MyPriority[ComboBox5->ItemIndex];

  P1->Resume();
  Form1->Label2->Caption= IntToStr(P1->Handle);
  P1->OnTerminate = ThreadDone;
  if(CheckBox1->Checked == true) P1->WaitFor();

  P2->Resume();
  Form1->Label3->Caption= IntToStr(P2->Handle);
  P2->OnTerminate = ThreadDone;


  P3->Resume();
  Form1->Label5->Caption=IntToStr(P3->Handle);
  P3->OnTerminate = ThreadDone;
  if(CheckBox1->Checked == true) P3->WaitFor();


  P4->Resume();
  Form1->Label6->Caption=IntToStr(P4->Handle);
  P4->OnTerminate = ThreadDone;
 if(CheckBox1->Checked == true) P4->WaitFor();

  P5->Resume();
  Form1->Label7->Caption=IntToStr(P5->Handle);
 P5->OnTerminate = ThreadDone;

}

//-------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 if(P1->Suspended == true){
   Button3->Caption == "Ïðèîñòàíîâèòü";
   P1->Suspend();
 }
 else{
   Button3->Caption == "Çàâåðøèòü";
   P1->Resume();
 }


}



//-------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
 if(P2->Suspended == true){
   Button4->Caption == "Ïðèîñòàíîâèòü";
   P2->Suspend();
 }
 else{
   Button4->Caption == "Çàâåðøèòü";
   P2->Resume();
 }
}
//-------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
 if(P3->Suspended == true){
   Button7->Caption == "Ïðèîñòàíîâèòü";
   P3->Suspend();
 }
 else{
   Button7->Caption =="Çàâåðøèòü";
   P3->Resume();
 }
}

//-------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
 if(P4->Suspended == true){
   Button9->Caption == "Ïðèîñòàíîâèòü";
   P4->Suspend();
 }
 else{
   Button9->Caption == "Çàâåðøèòü";
   P4->Resume();
 }
}
//-------------------------------

void __fastcall TForm1::Button11Click(TObject *Sender)
{
 if(P5->Suspended == true){
   Button11->Caption == "Ïðèîñòàíîâèòü";
   P5->Suspend();
 }
 else{
   Button11->Caption == "Çàâåðøèòü";
   P5->Resume();
 }
}

//-------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Close();
}
//-------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  P1->Terminate();
}
//-------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
  P2->Terminate();
}

//-------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
  P3->Terminate();
}
//-------------------------------
void __fastcall TForm1::Button10Click(TObject *Sender)
{
  P4->Terminate();
}
//-------------------------------
void __fastcall TForm1::Button12Click(TObject *Sender)
{
  P5->Terminate();
}
//-------------------------------






Файл Unit.h
Код


#ifndef Unit1H
#define Unit1H
 
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
 
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TCheckBox *CheckBox1;
        TProgressBar *ProgressBar1;
        TProgressBar *ProgressBar2;
        TComboBox *ComboBox1;
        TComboBox *ComboBox2;
        TLabel *Label1;
        TButton *Button1;
        TButton *Button2;
        TButton *Button3;
        TButton *Button4;
        TLabel *Label2;
        TLabel *Label3;
        TLabel *Label4;
        TButton *Button5;
        TButton *Button6;
        TComboBox *ComboBox3;
        TComboBox *ComboBox4;
        TComboBox *ComboBox5;
        TProgressBar *ProgressBar3;
        TProgressBar *ProgressBar4;
        TProgressBar *ProgressBar5;
        TButton *Button7;
        TButton *Button8;
        TButton *Button9;
        TButton *Button10;
        TButton *Button11;
        TButton *Button12;
        TLabel *Label5;
        TLabel *Label6;
        TLabel *Label7;
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button5Click(TObject *Sender);
        void __fastcall Button6Click(TObject *Sender);
        void __fastcall Button7Click(TObject *Sender);
        void __fastcall Button8Click(TObject *Sender);
        void __fastcall Button9Click(TObject *Sender);
        void __fastcall Button10Click(TObject *Sender);
        void __fastcall Button11Click(TObject *Sender);
        void __fastcall Button12Click(TObject *Sender);
private: void __fastcall ThreadDone(TObject *Sender);
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//-------------------------------
class IvanovP1 : public TThread
{
protected: void __fastcall Execute();
public:    __fastcall IvanovP1(bool CreateSuspended);
           float Fa;
};
//-------------------------------
class IvanovP2 : public TThread
{
protected: void __fastcall Execute();
public:    __fastcall IvanovP2(bool CreateSuspended);
           float Fb;
};
class IvanovP3 : public TThread
{
protected: void __fastcall Execute();
public:    __fastcall IvanovP3(bool CreateSuspended);
           float Fc;
};
class IvanovP4 : public TThread
{
protected: void __fastcall Execute();
public:    __fastcall IvanovP4(bool CreateSuspended);
           float Fd;
};
class IvanovP5 : public TThread
{
protected: void __fastcall Execute();
public:    __fastcall IvanovP5(bool CreateSuspended);
           float Fe;
};
//-------------------------------
extern PACKAGE TForm1 *Form1;
//-------------------------------
#endif
 

PM MAIL   Вверх
Dem_max
Дата 30.10.2013, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Судя по коду код потока завершился (произошел выход из Execute()) так что там приостанавливать и возобновлять я не вижу.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 30.10.2013, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(DDA04 @  30.10.2013,  09:25 Найти цитируемый пост)
Код

void __fastcall TForm1::Button3Click(TObject *Sender)
{
 if(P1->Suspended == true){
   Button3->Caption == "Ïðèîñòàíîâèòü";
   P1->Suspend();
 }
 else{
   Button3->Caption == "Çàâåðøèòü";
   P1->Resume();
 }
}
Перевожу -
if(P1->Suspended == true) - если поток остановлен, то 
P1->Suspend(); - остановить его еще раз.

Если же он работал, то
P1->Resume(); - пусть продолжает работать и дальше.

IMHO это не то, что вам было надо  smile 

PM MAIL   Вверх
SVN74
Дата 31.10.2013, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



Код

/-------------------------------
void __fastcall IvanovP1::Execute()
{
 float s = 0;
 for(int i=0;i<N;i++){
   s+= sin(i) + cos(i);
   ЭТО ТОЛЬКО ЧЕРЕЗ СИНХРОНИЗАЦИЮ ->   Form1->ProgressBar1->Position = i;
   if(Terminated)goto a1;
   // Sleep(1);  <- ОБЯЗАТЕЛЬНО НАДО ОСТАВИТЬ ХОТЯ БЫ SLEEP(1) А ЛУЧШЕ SPEEP(100); 
      }
a1:; Fa = s;
}


Это сообщение отредактировал(а) SVN74 - 31.10.2013, 16:37
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0882 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.