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


Автор: Step 25.2.2003, 19:37
у меня два приложения одно записывает результаты в лист бох, а другое их обрабатывает

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

Команду слееп ставить не хочется. и циклы проверки тоже запускать не желаю..

Автор: AntonSaburov 26.2.2003, 00:06
Так ответить не получится - давай код посмотрим ?

Цитата
обрабатывать изминения, но изменеия


И все-таки "изменения" smile.gif

Автор: Step 26.2.2003, 00:16
код прост
[CODE]
1 поток
a.insertstring(......);
soc.Send(...) // передается сообщения в другое поток, в данном случае поток т.к. пример проще, да сообщения в другой поток по сети кидается, не надо удивляться
2 поток
онресейве(...)
{
перебор записей в цикле, но последней записи не находит т.к. последняя запись долго запихивается через инсерт стринг, по профилингу инсерт стринг берет 6 процентов всего времени программы, а по сети пакет проходит даже быстрее чем вставляется запись.
}

Автор: AntonSaburov 26.2.2003, 01:28
Давай по шагам:

a.insertstring() - она у тебя, как я понимаю, асинхронная. Так ?
Пока строка вставляется ты посылаешь сообщение другому приложению.
И вот это второе приложение откуда берет список строк ?


Автор: Step 26.2.2003, 01:33
из первого приложения, каким макаром я получаю указатель на лист бокс не спрашывай...

Автор: AntonSaburov 26.2.2003, 01:39
А ты не хочешь сделать некий callback, который будет вызываться тогда, когда строка реально будет вставлена ?
Ну и там уже посылать сообщение.

Или эта функция тебе не подвластна вообще ? Если так, то лучше чем остановиться до появления строки в списке, я не вижу.



Автор: Step 26.2.2003, 01:48
вопрос в том как узнать что она уже добавленна, лист бок сообщения такого не дает и инсерт стринг работу моей функции не преостанавливает
кстати такая проблема возникает и при работе с бд через сеть

Автор: AntonSaburov 26.2.2003, 19:59
Ну тогда элегантного решения похоже нет. Можно передавать в Send параметры вставляемой строки а во втором приложении входить в цикл ожидания пока строка не появиться в списке. Но это тоже решение не очень.
sad.gif

Автор: Step 26.2.2003, 20:25
Цитата
Но это тоже решение не очень.
то - то и оно, а от лишь описан один случай когда возникает такая проблемма, а я встерчал уже таких проблем около 10 штук, и в основном это встречается в удаленных базах данных

Автор: AntonSaburov 26.2.2003, 20:30
Цитата
то - то и оно, а от лишь описан один случай когда возникает такая проблемма, а я встречал уже таких проблем около 10 штук, и в основном это встречается в удаленных базах данных


Это точно. На базах данных такое встречается регулярно. Вот и задумаешься о среднем слое, который такие вещи умеет.

Нет в этом мире совершенства sad.gif
Может оно и к лучшему. Иначе остались бы мы без работы biggrin.gif

Автор: Step 26.2.2003, 20:34
AntonSaburov а что ты думаеш о сообщении вм_чендж класса внд, может оно поможет, только я еще не могу это проверить, может ты выскажеш свои соображения

Автор: keisik 27.2.2003, 00:28
А есть такой вариант (правда, через одно место): меняешь лист бокс на лист контрол и изголяешься над колбэковой функцией сортировки, которая вызывается для пересортировывания элементов после добавления нового.

Автор: Step 27.2.2003, 00:46
keisik правда, что через жопу, но видать идея подходящая, буду пробывать, спасибо

Автор: keisik 27.2.2003, 01:36
По большому счёту там можно обойтись минимум извращений - при добавлении нового элемента можно ловить и обрабатывать LVN_ITEMCHANGED.

Автор: Step 27.2.2003, 02:09
keisik спасибо, но это решение справедливо только для конкретного случая, а хотелось бы знать что дядя Били по этому поводу придпринял....

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