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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2009, 15:31   #1
RNT
Пользователь
 
Аватар для RNT
 
Регистрация: 15.09.2008
Сообщений: 59
По умолчанию Изза потока зависает программа

Не пойму , почему изза потока (thread) зависает программа. Потоки ведь нужны как раз для того , чтобы программа не зависала. Я делаю чат , в отдельный поток вынес проверку соединения. Когда запускаю поток , программа виснет. Помогите пожалуйста правильно написать поток.
Вот код двух процедур потока:
Код:
procedure Check;
var
	s: TStringStream;
begin 
	while 2>1 do
	begin
		try
			s:=TStringStream.Create; //Инициализация потока s
			s.WriteString('CodeString');  //Запись сообщения в поток s
			s.Position:=0; //Установка позиция на начало потока s
			Form1.tcpc1.IOHandler.Write(s, s.Size, true); //Передача сообщения
			s.Clear;
			Form1.tcpc1.IOHandler.ReadStream(s);
			s.Position:=0;
			if s.ReadString(s.Size)='CodeStringAccepted' then
				Form1.LabelIndicator.Caption:='Связь есть';
			s.Free; //Уничтожение потока s
		except
			Form1.LabelIndicator.Caption:='Связи нет';
			try
				Form1.tcpc1.Connect;
			except
			end;
		end;
		Sleep(5000);
	end;
end;

procedure TCheckConnection.Execute;
begin 
	Synchronize(Check);
end;
Во вложении проект
Вложения
Тип файла: zip UnStable 10.0.zip (57.6 Кб, 21 просмотров)
RNT вне форума Ответить с цитированием
Старый 10.07.2009, 15:40   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Обязательно прочтите теорию работы с потоками. У вас никакой код в отдельном потоке не выполняется.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 10.07.2009, 15:48   #3
RNT
Пользователь
 
Аватар для RNT
 
Регистрация: 15.09.2008
Сообщений: 59
По умолчанию

Про потоки я читал . Этот код выполняется в отдельном потоке , и изза него не должна зависать программа. В чем ошибка ?
RNT вне форума Ответить с цитированием
Старый 10.07.2009, 15:49   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Нет, не выполняется. Плохо читали. Для чего предназначена процедура Synchronize ?
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 10.07.2009, 15:51   #5
RNT
Пользователь
 
Аватар для RNT
 
Регистрация: 15.09.2008
Сообщений: 59
По умолчанию

процедура Synchronize предназначена для обращения к VCL . Получается надо каждое обращение к компоненту indy писать в отдельной процедуре ?
RNT вне форума Ответить с цитированием
Старый 10.07.2009, 15:53   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Все, что выполняется в Synchronize, выполняется в VCK потоке. делайте выводы. Надо просто корректно спроектировать многопоточность и все )
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 10.07.2009, 15:56   #7
RNT
Пользователь
 
Аватар для RNT
 
Регистрация: 15.09.2008
Сообщений: 59
По умолчанию

Можете привести пример ?
RNT вне форума Ответить с цитированием
Старый 10.07.2009, 16:07   #8
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Synchronize предназначен именно для синхронизации с VCL потоком, т.е. в не должны выполняться потоково не безопасные методы, использоваться общие ресурсы и т.д. В самом же потоке вы должны оперировать объектами только самого потока. Т.е. если вы из потока работаете с каким- то компонентом, то вы его должны создать в потоке и работать с ним. Для простоты использования, можно пользоваться родным для Indyклассом TidThread , который в последних версиях выполнен в виде отдельного компонента на вкладке Indy/Misc , для синхронизации внутри него лучше использовать метод TidSync.Synchronize из модуля Idsync
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 10.07.2009, 16:27   #9
RNT
Пользователь
 
Аватар для RNT
 
Регистрация: 15.09.2008
Сообщений: 59
По умолчанию

Цитата:
если вы из потока работаете с каким- то компонентом, то вы его должны создать в потоке и работать с ним.
А как можно в потоке разместить компонент ? Компоненты ведь размещаются на форме
RNT вне форума Ответить с цитированием
Старый 10.07.2009, 19:15   #10
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Тогда вам рано читать про потоки. Любой компонент- объект, делайте выводы.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При создании нескольких экземпляров класса приложение зависает Mixasik Общие вопросы C/C++ 1 25.04.2009 13:25
Мышь зависает(вирусы!!!) OPEOP Безопасность, Шифрование 3 28.12.2008 16:56
VB6. Программа зависает при выполнении. Artinka Помощь студентам 2 03.04.2008 00:06
После подключения dll комп зависает!!! Irat Помощь студентам 1 07.02.2008 21:18