|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
27.11.2011, 18:17 | #1 |
Пользователь
Регистрация: 15.12.2010
Сообщений: 74
|
Обмен данными между процессами. Но вопрос по семафоры :)
Всем привет. Такое дело. Нужно было написать программу, а точнее две программы, которые реализуют следующую вещь:
Первая - сервер - содержит две нити (или потока, как вам угодно) - производителя. Они должны поочередно передавать информацию во вторую программу. Вторая - клиент - содержит лишь функцию получения данных от нитей сервера. Одновременно доступ к файлу, отображаемому в память, может иметь только кто-то один: либо одна из нитей, либо функция чтения. В задании сказано сделать это с семафорами. Сделать-то я сделал, но, поскольку не совсем дружу с семафорами и на событиях было бы куда проще это сделать, все получилось через одно место. А проблема, собственно, в том, что пишет только одна из нитей, и в чем дело я понять не могу. Есть еще одна маленькая неприятность: из-за дебильно повешенного семафора процесс-клиент читает пустую информацию из файла, пока не начинает работать нить. Но первостепенной, все же, является первая проблема. Код: Сервер: Код:
Код:
В общем, кому не сложно, помогите грамотно повесить семафоры на всё это дело. |
27.11.2011, 23:15 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
Во-первых, зачем два семафора? одним спокойно можно обойтись
Во-вторых Код:
В-четвёртых, зачем это? Код:
Последний раз редактировалось rpy3uH; 27.11.2011 в 23:24. |
27.11.2011, 23:58 | #3 | |
Пользователь
Регистрация: 15.12.2010
Сообщений: 74
|
Я в курсе, что можно одним. Если я делаю одним, то пишется-то с двух нитей, но каким-то образом читается только с одной и нет гарантии, что несколько раз подряд не пройдет запись. Мне нужно что-то вроде "записал-считал-записал", то есть "записал-записал-считал" недопустимо.
Отвечу сразу на первое и на четвертое. Захват hBufSem происходит в нитях в сервере. Этот семафор сигнализирует о том, что якобы буфер пуст и можно писать. Конструкция "в-четвертых" нужна затем, чтобы отслеживать, считан ли был буфер. Если этот семафор не освободится за 10 мс, то эта нить пролетела, т.к. буфер был по-прежнему несчитан. Цитата:
Если вас не затруднит, можете привести это к человеческому виду? Буду очень благодарен, так как все вечера со среды и весь сегодняшний день потрачены на это. |
|
28.11.2011, 09:35 | #4 | |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
Цитата:
например, в первых 4 байтах общего буфера памяти держать переменную, которая будет сожержать текущий размер данных в буфере, апри записи записывать не в начало, а в конец и после этого обновлять переменную Код:
Последний раз редактировалось rpy3uH; 28.11.2011 в 19:04. |
|
28.11.2011, 18:29 | #5 |
Пользователь
Регистрация: 15.12.2010
Сообщений: 74
|
Это, конечно здорово, но "по легенде" мне нельзя несколько раз писать. Боюсь, препод мне ататат устроит.
|
28.11.2011, 19:07 | #6 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
ладно, по другому: в клиенте после считывания данных из буфера обнуляй первый байт в нём. в потоках на сервере проверяй, если первый байт не равен нулю (в нём записан какой-то символ) значит писать в него ещё нельзя.
|
28.11.2011, 20:36 | #7 |
Пользователь
Регистрация: 15.12.2010
Сообщений: 74
|
Сделал. Теперь пишется и читается, все правильно. Только это не решило проблему с тем, что одна нить вообще никогда не пишет. Стабильно пишется и читается, но только с одной нити.
Текст великоват, посему прикрепил. |
28.11.2011, 20:54 | #8 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
Код:
попробуй вот так Код:
|
28.11.2011, 21:37 | #9 |
Пользователь
Регистрация: 15.12.2010
Сообщений: 74
|
Да, обидная ошибка. Обидная, как убитая ни на что неделя
Большое спасибо, заработало как надо. Пришлось, правда, рандомный Sleep в нити добавить, чтобы была более наглядная очередность. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
обмен данными между формами | zirm | Общие вопросы Delphi | 4 | 11.07.2011 22:39 |
Обмен данными между двумя процессами | ReGreed | Общие вопросы C/C++ | 6 | 27.05.2011 15:31 |
Обмен данными между С++ и С# | Stellvertreter | Общие вопросы C/C++ | 0 | 14.11.2008 14:18 |
Обмен данными между формами | Maks1978 | Общие вопросы C/C++ | 3 | 22.07.2008 15:35 |
Обмен данными между формами | Demien | Общие вопросы Delphi | 14 | 23.04.2008 22:04 |