Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52

Многопоточность в делфи

18.06.2014, 01:45. Показов 5657. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужны советы и помощь.

Суть задачи состоит в том что:

Есть компонент ListView.
Нужно сделать так что бы каждая строка была отдельным потоком, проще говоря, строка для пользователя была доступом в поток, и при её нажатии сбоку в компоненте Edit вывелась переменная того класса который в потоке, к примеру.

Подсказали сделать TList и в нём держать указатели на поток и при выборе какого то элемента в ListView брать из TList поток с тем же индексом. В принципе проблем нет.
Но я понял что, я не смогу управлять потоком, т.е. мне нужно будет изменить переменную в том классе добавить элемент в массив и т.д.( Естественно для всего этого будут свои методы), а я этого не смогу. Именно нужно что бы в потоке хранился класс, так как класс будет таким себе клиентом написанным на сокетах и будет общаться с сервером, будут главные процедуры класса к которым мне нужен доступ, как я писал уже выше.

Так вот как такое реализовать, возможно у кого то есть решение, или мысли, прошу помощи у Вас)
Спасибо

Добавлено через 33 минуты
Delphi
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
unit Unit3;
 
interface
    uses ScktComp, classes, Sysutils;
type
 
   TMyClass = class(TThread)
    private
      login : string;
      password : string;
      name_of_shop : string;
      ClientSocket1: TClientSocket;
      THRead : TMyThread;
      procedure OnReceive();
    public
      name_of_list :string;
      procedure Init(ip:string; port:integer; login,pass:string);
 
    published
    //  property item_name : string read login;
  end;
implementation
 
uses Unit1;
 
procedure TMyClass.Init(ip:string;port:integer;login,pass:string);
begin
   Create(false);
   ClientSocket1.Host:= ip;
   ClientSocket1.Port:= port;
   ClientSocket1.Open();
end;
{Дальше буду ловить событие получения чего то от сервера и обрабатывать.}
end.
Пробую так. Не знаю правильно ли и будет ли оно работать.
Вроде поток создаю. Вроде доступ ко всему что нужно есть. Прошу вашей помощи.

Добавлено через 4 часа 9 минут
Что будет если я в TList добавлять указатели на экземпляры класса(клас в себе содержит клиент-сокет и обрабатывает сойдинение) по сути оно должно работать.??
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.06.2014, 01:45
Ответы с готовыми решениями:

Делфи и многопоточность
Выдает ошибку, я через отладчик посмотрел http://*************/s/ighpcv вот ошибка. А вот код procedure TForm1.Button4Click(Sender:...

Как в Делфи выполнить код, написанный на Делфи, например в поле ввода?
Есть способ в Делфи выполнить код, написанный на Делфи, например в поле ввода?

У меня стоит Делфи 5, возможно еще поставить и Делфи 7, или будут проблемы?!
Где можно скачать Делфи 7, дайте ссылку! У меня стоит Делфи 5, возможно еще поставить и Делфи 7, или будут проблемы?!

74
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 15:14  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от mss Посмотреть сообщение
PeekMessage(Msg, 0, 0, 0, PM_REMOVE)
http://msdn.microsoft.com/ru-r... 85%29.aspx
Уже исправил) Но поток все равно завершился.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 15:29
если завершился, значит истинно while-условие либо в теле цикла возникло необработанное исключение
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 15:31  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
если завершился, значит истинно while-условие либо в теле цикла возникло необработанное исключение
Сделал так:
Delphi
1
2
while not false do
        Sleep(0);
Все равно не работает. Может вы все таки зайдёте в асю?)
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 15:35
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Сделал так:
while not false do
Sleep(0);
Все равно не работает
На основании чего сделано такое умозаключение ?

Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Может вы все таки зайдёте в асю?
Да что я там забыл ?)
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 15:39  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
На основании чего сделано такое умозаключение ?
Ну вечный цикл) Он же должен был бы работать.
Цитата Сообщение от mss Посмотреть сообщение
Да что я там забыл ?)
Я смогу оперативней задавать вопросы хД
А Вы отвечать)
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 16:09
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Ну вечный цикл) Он же должен был бы работать
Так я и спрашиваю - на основании чего ты сделал заключение что он не работает вечно ?)
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 16:15  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Так я и спрашиваю - на основании чего ты сделал заключение что он не работает вечно ?)
Ну поток завершается, хотя должен бы был работать до конца выполнения своей задачи т.е. вечного цикла
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 16:29
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Ну поток завершается
Да на основании чего ты утверждаешь что он завершается ?!
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 16:31  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Да на основании чего ты утверждаешь что он завершается ?!
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 16:35
Если так, то тот самый твой "вечный" цикл попросту не запускается на выполнение.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 16:38  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Если так, то тот самый твой "вечный" цикл попросту не запускается на выполнение.
Прошу прощения мой косяк, я делал Free после добавления указателя на экземпляр класса.

Подскажите как правильно добавить экземпляр класса в компонент TList очищая при это все буферные переменные, сейчас я делаю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm5.Button1Click(Sender: TObject);
var
  MyClass: ^MyThread;
begin
   New(MyClass);
   MyClass^:=  MyThread.Create(false);
   ClassList.Add(MyClass);
   //Dispose(MyClass);
   //MyClass.Free;
 
end;
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
19.06.2014, 16:50
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
чищая при это все буферные переменные
Не надо их очищать. Это не имеет смысла.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 17:01
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
в компонент TList
TList - это не компонент
Компонент - это наследник TComponent

List.Add(TMyThread.Create(..))

Но TObjectList при прочих равных условиях будет удобнее и функциональнее чем TList - по мешьшей мере ему можно поручить автоматическое уничтожение объектов, добавленных в его список
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
19.06.2014, 17:02
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
var
* MyClass: ^MyThread;
begin
* *New(MyClass);
Да и эта фигня с указателями абсолютно лишняя.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 17:04  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
TList - это не компонент
Компонент - это наследник TComponent
List.Add(TMyThread.Create(..))
Но TObjectList при прочих равных условиях будет удобнее и функциональнее чем TList - по меньшей мере ему можно поручить автоматическое уничтожение объектов, добавленных в его список
А обязательно сразу вызывать Create? Мне же нужно сначала инициализировать переменные в классе, еще до начала запуска потока.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
19.06.2014, 17:08
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
А обязательно сразу вызывать Create? Мне же нужно сначала инициализировать переменные в классе, еще до начала запуска потока.
Как же ты хочешь инициализировать что-то в классе до его создания?
1
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 17:16
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
А обязательно сразу вызывать Create? Мне же нужно сначала инициализировать переменные в классе, еще до начала запуска потока
Как раз для этого и предназначен Create

А чтобы поток сразу не стартовал, конструктор следует вызывать с параметром True
После вызова конструктора и необходимой доп.поготовки сконструированного объекта следует вызвать его метод Resume - рожденный спящим поток тут же стартует
1
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 17:52  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Как раз для этого и предназначен Create
А чтобы поток сразу не стартовал, конструктор следует вызывать с параметром True
После вызова конструктора и необходимой доп.поготовки сконструированного объекта следует вызвать его метод Resume - рожденный спящим поток тут же стартует
Спасибо большое, кнопку уже тыкнул)
Еще подскажите, как правильно организовать обработку пакетов которые я получаю, в пакете первые байты это его тип, я что то не сильно хочу делать большой свитч.

И еще как добавить свой тип данных, но есть одно но он динамический. может быть 1,2 или 3 байта длины.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 18:09
заголовок сообщения должен иметь фикс.размер, например, 8 байт, в составе которых:
4 байта - код типа сообщения
4 байта - длина тела сообщения, следующего за заголовком
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 19:49  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
заголовок сообщения должен иметь фикс.размер, например, 8 байт, в составе которых:
4 байта - код типа сообщения
4 байта - длина тела сообщения, следующего за заголовком
таковым он и есть(я про структуру), сам тип данных построен так что в зависимости от цифры пакуется оно по разному к примеру если число меньше 128 то это один байт если больше то уже два, так было сделано для экономии места

Добавлено через 1 минуту
У меня есть такая функция запаковки и розпаковки только они написаны на C# или php

Добавлено через 1 час 2 минуты
Ещё моё незнание как работать с указателями в делфи привело меня к тому что, я не знаю как дальше обратиться к созданному классу, создаю я его так как и Вы говорили:
Delphi
1
ClassList.Add(MyThread.Create(true));
А дальше что?

Добавлено через 4 минуты
Получилось так:
Delphi
1
2
3
MyThread(ClassList[0]).IP:= 'link5.pwonline.ru';
    MyThread(ClassList[0]).Port:= 29000;
    MyThread(ClassList[0]).Resume;
Но после запуска потока, программа зависает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.06.2014, 19:49

Здр, пожалуйста попробуйте запутсить .exe написанное на делфи 10 у себя, те у кого делфи 7
и скиньте скрин пожалуйста срочно http://www.fayloobmennik.net/4874373 перед тес как запустить, создайте файлы: 1.txt, 2.txt и key.txt...

Как открыть doc в делфи? Или как можно написать огромный текст в делфи?
Думаю поймете. Я решил сделать сборник книг. И в Delphi добавил список книг (в виде кнопок) и при выборе я бы хотел открыть форму где был...

То что работает в Делфи 7 - не работает в Делфи 2010
Здравствуйте есть прога создана в Delphi 7. Хочу теперь ее скомпилировать в Делфи 2010. Но выходят ошибки уже при открытии файла...

Многопоточность
Здравствуйте! Прошу помочь реализовать многопоточность. Написал брут, когда запускаю в 1 поток, всё идёт ок, как запускаю в 2 и более всё...

Многопоточность
Добрый день. Возникал у меня следующая проблема. Пишу программу по расчетам фазового равновесия пар-жидкость. В основном достаточно сложная...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru