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

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

18.06.2014, 01:45. Показов 5621. Ответов 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, 23:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Все структуры пакетов которые сервер отправляет клиенту мне известны
А мне нет.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
19.06.2014, 23:32  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
А мне нет.
К примеру структура первого пакета

opcode : cuint;
packet_len : cuint;
server_key : Octets;

cuint - тот самый тип.

Octets - это хекс строка запакована так: ( 0xFFEEAA9F - сам хекс код? а перед ним идёт длинна запакованная с помощью cuint)
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.06.2014, 23:55
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
cuint - тот самый тип
Какой "тот самый" ?)

Добавлено через 6 минут
Совет: не уподобляйся приснопамятному Остапу Бендеру - "мне нужно все сразу")
Мухи отдельно, а котлеты отдельно)

Взялся за организацию потоков ? Ну так и доведи сначала эту кухню до ума !
Только потом будет смысл взяться за транспортную логику сокета, реализацию протокола инф.обмена, "розпаковку" и пр. не относящуюся собственно к потокам лабуду)
При таких скромных познаниях переварить эту кашу целиком и разом тебе не по силам.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
20.06.2014, 00:03  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
При таких скромных познаниях переварить эту кашу целиком и разом тебе не по силам.
Ну в принципе я и прошу маленький пример такого класса) А потоки я уже доделал.

Добавлено через 1 минуту
Уподобляться приходится, где я еще найду такого человека как Вы) Который все розкажет и покажет.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.06.2014, 00:12
О каком классе может идти речь, если до сих пор не ясно что это за "тот самы тип" ?)

Цитата Сообщение от MrPro100Viper Посмотреть сообщение
А потоки я уже доделал
Позволю себе не без оснований усомниться в истинности заявления)
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
20.06.2014, 00:20  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
О каком классе может идти речь, если до сих пор не ясно что это за "тот самы тип" ?)
Это тот тип, который динамический) К которому я скинул функцию розпаковки, и к которому я приложил рисунок структуры. К нему было бы хорошо сделать свой класс, и в случае добавления переменной данного типа в структуру , сделать так чтоб структура читала так же как и стандартные типы.

К примеру если у нас есть массив байт. и структура пакета, вызывать функцию, которая бы парсила эти байты и розбивала их по структуре в свои места.
И реверс данной функции, которая бы принимала структуру(где все поля заполнены)
и возвращала нам массив байт.

Цитата Сообщение от mss Посмотреть сообщение
Позволю себе не без оснований усомниться в истинности заявления)
А что еще нужно?) Потоки создаются, у меня есть доступ к методам данного потока, я успешно читаю пришедшие данные и могу отправить ответ серверу.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.06.2014, 00:44
Мдя, тяжелый случай)

Ладно, попробуем на огурцах)

То есть ты желаешь при приеме сообщения от сервера получить из сокета последовательность байт заранее неизвестной длины (тот самый cuint), представить эту последовательность в виде дельфийских данных типа
Delphi
1
array of byte
и передать эти данные параметром в функцию "розпаковки", чтобы получть на ее выходе значение типа integer, являющее собой, например, код операции ?
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
20.06.2014, 00:59  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Мдя, тяжелый случай)
Ладно, попробуем на огурцах)
То есть ты желаешь при приеме сообщения от сервера получить из сокета последовательность байт заранее неизвестной длины (тот самый cuint), представить эту последовательность в виде дельфийских данных типа
Код Delphi
1
array of byte
и передать эти данные параметром в функцию "розпаковки", чтобы получть на ее выходе значение типа integer, являющее собой, например, код операции ?
Не совсем так)

Вот чего я добиваюсь.

Сервер отправил нам сообщение, мы его записали в переменную типа
Delphi
1
array of byte
Потом начинаем парсить этот пакет.

Читаем номер пакета, и его длину, по номеру находим структуру по длине читаем наш пакет до конца. Отправляем наш пакет и структуру в универсальную функцию(если такое возможно) которая аргументами принимает массив байт и саму сруктуру.
А дальше с помощью номера находим и функцию/процедуру которая обработает уже полученную структуру и ответит серверу.

Есть условие
Если после получения длинны пакета оказалось что за ним следом шел еще и второй пакет мы режем массив на два пакета и по очереди обрабатываем их способом выше.

Можно конечно написать две функции toCuint и unCuint сделать большой свитч и для каждого пакета свою функцию парсинга, но это я думаю большая ошибка т.к. можно сделать как то красивей и аккуратней.

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

Добавлено через 1 минуту
На основе написанного понял что сморозил фигню про создание своего типа данных, т.к. нужно все равно знать номер пакета и читать его нужно будет функцией.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
20.06.2014, 02:03
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Ну в принципе я и прошу маленький пример такого класса
Маленьким примером тут не отделаешься. Слишком объемный вопрос.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.06.2014, 09:12
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Сервер отправил нам сообщение, мы его записали в переменную типа
array of byte
Это как это ты записал его, если длина сообщения заранее неизвестна ?)
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
20.06.2014, 15:19  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Это как это ты записал его, если длина сообщения заранее неизвестна ?)
Delphi
1
2
3
4
5
6
l:= Socket.ReceiveLength; //получаем длину пришедших данных
    SetLength(Bytes,l);
    Socket.ReceiveBuf(Buffer,l); //Заполняем наш буфер пришедшими данными
    //Обрабатываем пришедшие данные
    //
 SetLength(Bytes,0);
Вот так мне подсказали делать, по сути так и нужно т.к. после получения пакета в буфер его надо розшифровать и потом розпаковать.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.06.2014, 15:56
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Вот так мне подсказали делать
За такие вот подсказки кого-то нужно лупить нещадно)

Цитата Сообщение от MrPro100Viper Посмотреть сообщение
//получаем длину пришедших данных
Пришедших данных, а не пришедшего сообщения !

Это вовсе не одно и тоже.
Кроме этого в справке к ф-ции ReceiveLength черным по белому сказано
Code
1
Note: ReceiveLength is not guaranteed to be accurate for streaming socket connections.
Это значит что последующий вызов ReceiveBuf не обязан прочитать из сокета ровно столько, сколько вернула ф-ция вышевызванная ReceiveLength. Т.е. она может прочитать любое кол-во байт, но не более того которое было запрошено к чтению по результатам предшествующего вызова ReceiveLength.
А вот сколько она в реальности прочитала - об этом скажет результат, возвращенный функцией ReceiveBuf, который ты никак не анализируешь, бездумно копируя логику тех самых горе-подсказчиков)

Цитата Сообщение от MrPro100Viper Посмотреть сообщение
после получения пакета в буфер
Еще раз:
1. Пакет - это сообщение.
2. Длины сообщения ты не знаешь, и ReceiveLength в этом не помощник, ибо работает она на уровне транспортируемых данных, а не на уровне прикладных сообщений.
3. Прочитать целиком отдельное сообщение, не зная заранее его длины, невозможно.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
20.06.2014, 16:24  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Прочитать целиком отдельное сообщение, не зная заранее его длины, невозможно.
Игровой клиент же как то читает))

Сейчас спрошу у знатоков в этом деле) Тогда отвечу вам корректно.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.06.2014, 16:37
Цитата Сообщение от MrPro100Viper Посмотреть сообщение
Игровой клиент же как то читает
Потому что читает он правильно - в соответствии с транспортной логикой и прикладным протоколом.
0
0 / 0 / 1
Регистрация: 03.01.2014
Сообщений: 52
20.06.2014, 23:41  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Потому что читает он правильно - в соответствии с транспортной логикой и прикладным протоколом.
Ну смотрите, клиент же получает также зашифрованные данные без их длины в начале

Добавлено через 4 часа 2 минуты
Уточнил, уже сам знаю как организовать получение полного пакета.
Подскажите как лучше, правильно, и самое главное что бы быстро организовать логику, чтоб не плодить большой свитч и много функций.

Добавлено через 29 минут
И ещё, тот цикл который создан в функции Execute, нужно остановить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2014, 23:41

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
75
Ответ Создать тему
Новые блоги и статьи
Скрипты 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