Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2013, 16:47   #1
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию Многопоточность.TThread.Инициализац ия нескольких нитей.

Доброго времени суток.
Изучаю многопоточность, конкретно остановился на классе TThread.
Перелопатил множество инфы в рунете, но все никак не могу найти адекватного примера объявления нескольких нитей.
Товарищ дельфист с моей помощью написал код.
Код:
// Объявление потока
class NewTH : public TThread
{
private:
	UnicodeString LogString;
protected:
	void __fastcall Execute();
	void __fastcall Log();
public:

	__fastcall NewTH(bool CreateSuspended);
	int THId;
};
void __fastcall NewTH::Log()
{
	Form1->Memo1->Lines->Add("Поток # " + IntToStr(THId));
}
void __fastcall NewTH::Execute()
{
	Synchronize(Log);
}
Вот реализация:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
NewTH *Lol;
	for (int i=1; i < 5; i++)
	{
		Lol = new NewTH(true);
		Lol->THId=i;
		Lol->Resume();
	}

}
Код работает следующим образом:по нажатию кнопки в мемо выводятся числа 1,2,3,4.Всё вроде как пучком, однако меня смущает реализация, сделанная моим другом.Имея один указатель, он на закрепленный за ним адрес памяти вешает все потоки, что в голове у меня не укладывается.

Помогите, пожалуйста, вправить мне мозги на место объяснить, как оно все работает(если друг прав), или же подскажите толковые способы объявления множества потоков(если товарищ все-таки неправ).
greenisius вне форума Ответить с цитированием
Старый 16.11.2013, 17:34   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

ВВсе правильно, суть потоков в том, чтоб работать с одними и теми же данными отдновременно. Начните читать про семафоры и мьютексы - http://ru.wikipedia.org/wiki/%D0%A1%...B8%D0%BA%D0%B0)
waleri вне форума Ответить с цитированием
Старый 16.11.2013, 17:39   #3
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию

Спасибо большое.
А что, если для каждого экземпляра создавать свой указатель?
И как так получается, что данные, находящиеся в одном потоке не перекрываются данными при переопределении указателя?
greenisius вне форума Ответить с цитированием
Старый 16.11.2013, 19:11   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Указатель в данном случае используется только для назначения Id потоку и его запуска. Указателю каждый раз присваивается значение нового экземпляра потока, при этом теряя значение предыдущего. Если грубо попытаться объяснить, то
Код:
int A[4];
int B;

B = A[0];
B = A[1];
B = A[2];
B = A[3];
Здесь пременная В каждый раз теряет предыдущее значение, то сами элементы массива никуда не деваются и продолжают существовать, не зависимо от того, чему равняется В. Единственный недостаток в том, что теряется возможность доступа к отдельному экземпляру потока. Если нужно в процессе работы управлять работой потоков [приостанавливать их, запускать заново, передавать или получать какие-либо данные и т.д.], то лучше назначить каждому потоку свой собственный указатель...
FataLL вне форума Ответить с цитированием
Старый 16.11.2013, 19:49   #5
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию

Спасибо, довольно исчерпывающе.
greenisius вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При освобождении обьекта TThread, он вешает всю программу. При этом код Execute у TThread уж выполнился.. Человек_Борща Общие вопросы Delphi 23 30.11.2011 09:18
Класс TThread Анастаська Помощь студентам 11 15.11.2011 15:14
TThread в С++ Builder alun C++ Builder 7 02.06.2010 21:55
TThread Vladislav_I Общие вопросы Delphi 0 30.04.2010 19:47
TThread и GUI Freezer Общие вопросы Delphi 8 05.08.2009 11:50