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

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

18.06.2014, 01:45. Показов 5636. Ответов 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
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 21:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
так было сделано для экономии места
Какого "места" ?
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 21:22  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Какого "места" ?
Данные берутся с сервера, там их очень много и тип пакета и его длинна запакованы таким способом.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 21:27
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
там их очень много
Тебя так шибко заботит место на сервере ?)
И как же ты какой-то там своей "паковкой" экономишь это самое место на сервере ?
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 21:33  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Тебя так шибко заботит место на сервере ?)
И как же ты какой-то там своей "паковкой" экономишь это самое место на сервере ?
Я не экономлю) Сервер не мой, так сделали китайцы, при подсчетах мне получилась цифра что на 1000 записей экономия где то 100 мегабайт, это много) т.к. записей может быть миллион.

Так все таки как можно сделать такой класс структуру?

Если надо скину аналоги функций запаковки и розпаковки.

Добавлено через 1 минуту
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Ещё моё незнание как работать с указателями в делфи привело меня к тому что, я не знаю как дальше обратиться к созданному классу, создаю я его так как и Вы говорили:
Код 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
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 21:42
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Я не экономлю
Тогда зачем ты упоминаешь об экономии ?

Цитата Сообщение от MrPro100Viper Посмотреть сообщение
как можно сделать такой класс структуру?
Надо иметь перед глазами протокол инф.обмена с тем самым китайским чудом)

Цитата Сообщение от MrPro100Viper Посмотреть сообщение
как сделать так что бы программа не зависала.
Нужно исправить ошибки в своей программе
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 21:45  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Тогда зачем ты упоминаешь об экономии ?
Потому что сервер заставляет работать с таким типом который экономит.
Цитата Сообщение от mss Посмотреть сообщение
Надо иметь перед глазами протокол инф.обмена с тем самым китайским чудом)
Могу предоставить алгоритм запаковки.
Цитата Сообщение от mss Посмотреть сообщение
Нужно исправить ошибки в своей программе
Но их там по сути нету. Экземпляр добавляется в TList. Я заполняю поля в классе так как мне нужно и потом возобновляю поток, а программа виснет

Добавлено через 32 секунды
Я же вас прошу пошли в асю)
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 22:00
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
их там по сути нету
Если нету, значит должно работать)
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 22:10  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Если нету, значит должно работать)
Delphi
1
2
3
4
5
6
    
    ClassList.Add(MyThread.Create(true));
 
    MyThread(ClassList[0]).IP:= 'link5.pwonline.ru';
    MyThread(ClassList[0]).Port:= 29000;
    MyThread(ClassList[0]).Resume;
Если создаю так тогда зависает.
А если так:
Delphi
1
2
3
4
5
6
7
8
9
var 
MyClass : ^MyThread;
begin
 MyClass^:= MyThread.Create(true);
 MyClass^.IP:= 'testip';
 MyClass^.Port:= 29000;
 MyClass^.Resume;
 ClassList.Add(MyClass);
end;
то нет.
Не хочу работать как в кругом способе,это не красиво, да и как потом освободить переменную MyClass так чтобы не удалить экземпляр класса.

И что подскажите делать с тем динамическим типом данных?
Предоставить Вам функцию?)

Добавлено через 27 секунд
Просто хочется написать один раз красиво и правильно, чем потом по 100 раз переделывать.

Добавлено через 2 минуты
Прошу прощения вариант №2 тоже зависает.
Прикрепить код полной программы?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 22:19
Delphi
1
2
3
4
5
6
7
8
var 
  NewThread: TMyThread;
..
 NewThread := TMyThread.Create(true);
 NewThread.IP:= 'testip';
 NewThread.Port:= 29000;
 NewThread.Resume;
 MyThreadList.Add(NewThread);
Добавлено через 1 минуту
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
как потом освободить переменную MyClass так чтобы не удалить экземпляр класса
не надо ее освобождать
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 22:21  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
var
* NewThread: TMyThread;
..
*NewThread := TMyThread.Create(true);
*NewThread.IP:= 'testip';
*NewThread.Port:= 29000;
*NewThread.Resume;
*MyThreadList.Add(NewThread);
А почистить после себя память разве не нужно??
И ещё что насчет того типа данных? Подскажите хотя бы просто пример как такое реализовать)))
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 22:24
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
А почистить после себя память разве не нужно?
Какую память-то ? Память, занятую переменной MyThread ? Не нужно.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 22:25  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Какую память-то ? Память, занятую переменной MyThread ? Не нужно.
Вы как будто игнорируете вопросы про тот динамический тип)
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 22:27
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
пример как такое реализовать
Да пойми ты наконец - без наличия перед глазами внятной и подробной инф-ции о протоколе инф.обмена разговаривать о реализации бессмысленно)

Добавлено через 1 минуту
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
вопросы про тот динамический тип
Повторяю - нужно иметь перед глазами полное и подробное описание протокола инф.обмена между сервером и клиентом.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 22:30  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Повторяю - нужно иметь перед глазами полное и подробное описание протокола инф.обмена между сервером и клиентом.
Минутку.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 22:32  [ТС]
Вот детальная илюстрацыя данного типа
Миниатюры
Многопоточность в делфи  
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 22:37  [ТС]
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function CUInt(Pack: array of byte): integer;
var
V: integer;
B1,B2,B3,B4: byte;
begin
 B1 := Pack[0];
if (B1 < $80) then V := B1
else
   if (B1 < $C0) then
   begin
   B2 := Pack[1];   
   V := (( B1 Shl 8 ) or B2) and $3FFF;
   end
   else
   begin
   B2 := Pack[1];
   B3 := Pack[2];
   B4 := Pack[3];
   V := (( B1 Shl 24 ) or ( B2 Shl 16 ) or ( B3 Shl 8 ) or B4 ) and $1FFFFFFF;
   end;
result:= V;
end;
Функция запаковки числа. Хорошо бы было как то перенести её в класс, что бы создавать собственный тип, и ещё реверсить для получения числа из байт

Добавлено через 2 минуты
Пардон, это функция розпаковки числа. И надо реверсить её
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 22:45
Ну и сколько таких "запакованных чисел" передает сервер в одном сообщении ?
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 22:57  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Ну и сколько таких "запакованных чисел" передает сервер в одном сообщении ?

От двух и больше, сервер может передать хекс строку и её длинна запакована таким способом к примеру.
Или количество последующих повторений чего то.

Было бы хорошо как то реализовать так что функции передается структура, и байты и она их розпакует.
В структуре к примеру будут простые типу и такой тип, который бы получил байты и вычислил то число которое нужно а потом переместил указатель для чтения.

Добавлено через 4 минуты
ещё возникла проблема, потоки создаются и работаю как надо, но программу закрыть нельзя. Приоритет потоков я поставил нормальный. Как сделать так что бы потоки закрывались при закрытии програмы

Добавлено через 4 минуты
Пока сделал так, программу теперь закрывается нормально но я думаю что это не правильный подход.
Delphi
1
2
  for I := 0 to ClassList.Count-1 do
      MyThread(ClassList[I]).MTerm:= true;
Где MTerm переменная Terminated
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 23:04
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
функции передается структура
Структура чего ? И откуда она возьмется на стороне клиента, перед тем как передавать ее на вход функции ?
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 23:12  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Структура чего ? И откуда она возьмется на стороне клиента, перед тем как передавать ее на вход функции ?
Структура пакета который приходит для клиента.

Все структуры пакетов которые сервер отправляет клиенту мне известны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.06.2014, 23:12

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Скрипты 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
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru