Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проектирование приложения


Автор: ButtonOFF 1.4.2013, 23:11
Ребята добрый вечер.

На повестке дня создать TCP сервер (он же клиент) со своим протоколом передачи информации. С сетевой стороны будут использоваться порты завершения (на край WSAEventSelect). Будут висеть потоки или поток обрабатывающий сокеты (их будет несколько) на входящий данные и подключение клиентов. Проблема сейчас такая, я не хочу использовать потоки обслуживающие сокеты для обращения к базе данных и выполнения каких то вычислительных операций. Чувствую что должен быть какой-то механизм передачи пакета данных (не сетевого, а структуры или хотя бы указателя) другому потоку типа SendMessage только потоку. Конечно можно что-нибудь придумать и это будет работать, но хотелось бы найти иное решение, такое есть? Т.е я хочу повесить всю обработку запросов и отправку данных на другой поток и что бы этот поток извлекал "задачи" из очереди поставленные другим потоком а в свободное время спал. Я склоняюсь к портам ввода/вывода, можно их для этих целей использовать?

Автор: k0rvin 2.4.2013, 18:20
У потоков и так разделяемая память, только доступ к ней нужно синхронизировать (или типа того). Вот тут могут быть некоторые полезные подсказки: http://stackoverflow.com/questions/3868403/delphi-threading-which-parts-of-code-need-to-be-protected-synchronized

Автор: Poseidon 2.4.2013, 20:52
Цитата(ButtonOFF @  1.4.2013,  23:11 Найти цитируемый пост)
Чувствую что должен быть какой-то механизм передачи пакета данных (не сетевого, а структуры или хотя бы указателя) другому потоку типа SendMessage только потоку.
А можешь на конкретном примере показать что именно нужно будет передавать между потоками? Как бы вариантов общения потоков между собой не так уж и много, что бы не знать какой выбрать.

Автор: ButtonOFF 3.4.2013, 23:12
Poseidon, ну наример мне нужно наверное потоку для работы с БД отправлять данные типа структуры или буфера, но я от этого варианта наверное откажусь

Ну в общем я порылся, есть оказывается ф-ия отправки сообщения потоку.

Сейчас схема у меня такая.
Поток главного окна создает мой класс сервера. Из него создается 1 поток для прослушки входящих соединений и привязывает новые сокеты к порту завершения, и еще n кол-во = кол-ву процессоров уже рабочие потоки которые читают из порта завершения, потом они так же будут работать с БД поэтому мне кажется что это нормальное решение. Будет наверное еще 1 поток который будет добавлять новые события к порту завершения на выполнение на сокетах (отправку или подключение к другому серверу).
Вроде все нормально, есть пока что 1 но. Мне надо писать лог, а запись в файл дорогая операция + если синхронизировать все потоки то выигрыша в скорости не получится никакого, так вот я решил слать сообщения главному окну через
Код

PostMessage(hwnd, LOG_MSG, String или PChar, (как вариант размер строки))

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

Автор: ButtonOFF 5.4.2013, 12:37
Народ, кто знает, почему TXMLDocument когда его создаю в памяти указываю версию и кодировку получается без кодировки ? А если сохранить на диск то кодировка появляется. т.е

На диске

Код

<?xml version="1.0" encoding="windows-1251" ?> 
<query>
</query>


А в памяти

Код

<?xml version="1.0"?> 
<query>
</query>


И кодировка ### нужна, без нее почемуто, при условии что есть русские буквы, не открывается XML в TXMLDocument'е.  smile 
А сохранять на диск нет возможности.

Код

  XMLDoc := TXMLDocument.Create(nil);
  XMLDoc.Active := True;
  XMLDoc.Encoding := 'windows-1251';
  XMLDoc.Version := '1.0';
  qNode := XMLDoc.AddChild('query');
  
  XMLDoc.XML.Text = '<?xml version="1.0"?><query></query>';
  XMLDoc.ChildNodes.First.Text = 'version="1.0" encoding="windows-1251"';

smile Клато Верато Никхе-кхе-кхе

Автор: Akella 5.4.2013, 13:17
Цитата(ButtonOFF @  5.4.2013,  12:37 Найти цитируемый пост)
Народ, кто знает, почему TXMLDocument когда его создаю в памяти указываю версию и кодировку получается без кодировки ?

Никто и ничего не будет за тебя конвертировать. Сам конвертируй.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)