Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
1

Правильно завершить поток

29.12.2015, 15:39. Показов 3405. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!!!

Делаю программу через поток. Вот код
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
#include <vcl.h>
#pragma hdrstop
 
#include "UTime1.h"
#include "UTime2.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
MyTime *Thread;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BBeginClick(TObject *Sender)
{
Thread = new MyTime(false);
Thread->FreeOnTerminate = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BRespClick(TObject *Sender)
{
  Thread->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  Thread->Terminate();
}
//---------------------------------------------------------------------------
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
#include <windows.h>   // чтобы не было проблем с неймспейсами
#include <wininet.h>   // интернет функции WinAPI
#include <vcl.h>
#pragma hdrstop
#include "UTime1.h"
#include "UTime2.h"
#pragma package(smart_init)
#pragma link "wininet.lib"   // линкуем библу
extern MyTime *Thread;
//---------------------------------------------------------------------------
 
 
__fastcall MyTime::MyTime(bool CreateSuspended)
    : TThread(CreateSuspended)
{
 
oldstate = true;
}
//---------------------------------------------------------------------------
void __fastcall MyTime::Execute()
{
    DWORD flags;
    while(!Terminated) {
        bool state = InternetGetConnectedState(&flags, 0);
        if(state != oldstate) {
            if(state) ShowMessage("Сетевой кабель подключён");
            else ShowMessage("Сетевой кабель отключен");
            oldstate = state;
        }
        Sleep(100);
    }
}
//---------------------------------------------------------------------------
Так вот если нажать на кнопку BBeginClick, а потом на BRespClick, то ошибки никакой не будет, если сначало нажать BRespClick, то выходит ошибка (см. скриншот).

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

Заранее благодарен за ответ
Миниатюры
Правильно завершить поток  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2015, 15:39
Ответы с готовыми решениями:

Как правильно завершить поток
Всем привет. Что я делаю не так ? Поток запускается и работает хорошо, но вот при завершении...

Завершить поток через 60 секунд
Здравствуйте, подскажите как завершить поток через 60 секунд ? Поток создаю так: DWORD WINAPI...

Как правильно завершить приложение?
Close(); //или Application-&gt;Terminate(); как правильно?

Как правильно отправить в поток?
Приветы всем. Помогите разобраться с потоками на простом примере. Ситуация бывает такая, при...

8
Практикантроп
4827 / 2719 / 526
Регистрация: 23.09.2011
Сообщений: 5,778
29.12.2015, 15:49 2
Цитата Сообщение от Sasha Посмотреть сообщение
Как правильно освободится от потока
А правильно ли это? указывать Thread->Terminate(); когда еще поток не создан (new MyTime), - только объявлен (MyTime *Thread;)?
1
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.12.2015, 16:38  [ТС] 3
Не правильно

Добавлено через 37 минут
А как коректно проверить создан или работает, чтобы его отключить?
0
Практикантроп
4827 / 2719 / 526
Регистрация: 23.09.2011
Сообщений: 5,778
29.12.2015, 16:40 4
Я считаю, что Thread не нулевое значение, когда его успешно создали. Сразу после объявления там зеро... .
1
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.12.2015, 17:04  [ТС] 5
Странно изначально был глюк, потом перекомпелировал полностью и получилось.
Честно говоря меня смутила вот эта строка
C++
1
MyTime *Thread;
Поэтому много вопросов и возникло
0
Практикантроп
4827 / 2719 / 526
Регистрация: 23.09.2011
Сообщений: 5,778
29.12.2015, 17:15 6
.. я стараюсь не давать общеупотребительные (банальные д.с, без индексов) имена своим переменным. И думаю - это правильно.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2015, 00:54 7
C++
1
2
3
4
5
void __fastcall TForm1::BBeginClick(TObject *Sender)
{
Thread = new MyTime(false);
Thread->FreeOnTerminate = false;
}
Логически не верно устанавливать свойства потока после его запуска.

C++
1
ShowMessage("Сетевой кабель подключён");
Из потока??
Кто будет удалять класс потока после его завершения?
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
01.01.2016, 16:58  [ТС] 8
Цитата Сообщение от Avazart Посмотреть сообщение
Из потока??
Avazart, я не понял вопроса?
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 634
02.01.2016, 17:00 9
Цитата Сообщение от Sasha Посмотреть сообщение
Avazart, я не понял вопроса?
Надо через синхронизацию это выполнять.
0
02.01.2016, 17:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2016, 17:00
Помогаю со студенческими работами здесь

Как правильно завершить поток QThread и выйти из него?
Здравствуйте, форумчане! Есть GUI-приложение, кнопка в окне приложения запускает цикл обмена...

Как правильно завершить поток, который лочит мьютекс в цикле?
Есть поток, созданный посредствам CreateThread, который в цикле лочит именной мьютекс, ну типа...

Как завершить поток
Как завершить поток, начатый _beginthread( Thread, 0, NULL );

Как принудительно завершить поток скачивания
Пишу утилиту по скачиванию файлов. Нужно, чтобы по нажатию кнопки Pause закачка прекращалась, без...

Сокеты и QThread - как корректно завершить поток
Пишу клиент с использованием QTcpSocket. Вынес разбор принимаемых сообщений в отдельный поток, но...

ExitProcess как правильно завершить процесс?
Есть цикл, в котором поочередно открываются процессы. при использовании ExitProcess(0) выкидывает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru