Форум программистов, компьютерный форум, киберфорум
Gdasar
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Работа с 2-мя потоками

Запись от Gdasar размещена 11.10.2014 в 22:19
Показов 154 Комментарии 0

Работа с 2-мя потоками
Цитата Сообщение от Sasha Посмотреть сообщение
Здравствуйте! Ребята, помогите, разобраться решил уделить внимание потокам в программе и изучить как их лучше применять. Для этого открыл книгу Архангельского и нашёл раздел потоки и начал вводить из книги пример который представлен там. На один поток работает исключительно, а вот когда 2, то почему-то один поток работает, другой ждёт пока первый закончит работу, чтобы возобновить себе работу, но почему-то воторой поток не хочет выполнять те действия которые написаны из примера книги.

Вот код из книги на 2 потока

#include "UTime1.cpp"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <vcl.h>
#pragma hdrstop
 
#include "UTime1.h"
#include "UTime2.h"
#include "UTime3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
MyTime *Thread;
TResult *Result;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BBeginClick(TObject *Sender)
{
Thread = new MyTime(false);
Result = new TResult(false);
Thread->FreeOnTerminate = true;
BBegin->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BRespClick(TObject *Sender)
{
Thread->Terminate();
}
//---------------------------------------------------------------------------
UTime1.Н

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef UTime1H
#define UTime1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TLabel *Label1;
    TButton *BBegin;
    TButton *BResp;
    void __fastcall BBeginClick(TObject *Sender);
    void __fastcall BRespClick(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


#include "UTime2.cpp"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <vcl.h>
#pragma hdrstop
#include "UTime1.h"
#include "UTime2.h"
#include "UTime3.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(&UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall MyTime::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall MyTime::MyTime(bool CreateSuspended)
    : TThread(CreateSuspended)
{
TMax = EncodeTime(0,0,10,0);
}
//---------------------------------------------------------------------------
void __fastcall MyTime::Execute()
{
    T0 = Now();
    do
      Synchronize(NewCaption);
    while(!Terminated && ((double)(TMax - (Now()-T0))>=0));
    Synchronize(Result);
}
//---------------------------------------------------------------------------
 void _fastcall MyTime::NewCaption()
 {
     Form1->Label1->Caption = TimeToStr(TMax-(Now()-T0));
 }
 void _fastcall MyTime::Result()
 {
     if(Terminated)
     {
       ShowMessage("Ответ получен своевременно");
       ReturnValue = 0;
 
     }
     else
     {
       ShowMessage("Время на ответ исчерпано");
       ReturnValue = 1;
     }
     Form1->BBegin->Enabled = true;
 }
H-файл UTime2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef UTime2H
#define UTime2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
class MyTime : public TThread
{
private:
    void _fastcall NewCaption();
    void _fastcall Result();
protected:
    void __fastcall Execute();
public:
    __fastcall MyTime(bool CreateSuspended);
    TDateTime T0, TMax;
};
//---------------------------------------------------------------------------
#endif
#include "UTime3.cpp"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <vcl.h>
#pragma hdrstop
#include "UTime1.h"
#include "UTime2.h"
#include "UTime3.h"
#pragma package(smart_init)
extern MyTime *Thread;
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(&UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TResult::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall TResult::TResult(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TResult::Execute()
{
    
    Res = Thread->WaitFor();
    Synchronize(Result2);
    delete Thread;
   //   Thread = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TResult::Result2()
{
    if(Res == 0)
    {
        ShowMessage("Вы успешно прошли тестирование");
    }
    else
    {
        ShowMessage("Вы не прошли тестирование");
    }
}
H-файл UTime3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef UTime3H
#define UTime3H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
class TResult : public TThread
{
private:
  void __fastcall TResult::Result2();
  int Res;
protected:
    void __fastcall Execute();
public:
    __fastcall TResult(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
Вообщем проблема в том что не появляется в конце сообщения Вы успешно прошли тестирование или Вы не прошли тестирование, после сообщений Ответ получен своевременно или Время на ответ исчерпано

Я понял что затык именно в этой строке

C++
1
Res = Thread->WaitFor();
Кажется в книге опечатка либо что-то не дописано......
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru