Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: синхронизация потоков...  (Прочитано 27084 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sommer
Молодой специалист

us
Offline Offline

« : 07-10-2003 13:19 » 

VC++
есть диалоговое окно.
внем форма для ввода текста IDC_EDIT
CString m_data;

создается поток и ему передается указатель на m_data

в потоке m_data что-то присваивается и нужно чтообы это появилось в той самой форме("обновить" диалоговое окно)
в обычном случае(без потокка) я бы сделал UpdateData(false);
.. тоогда передадим потоку указатель и на диалоговое окно и сделаем там pointer->UpdateData(false);..

и в этот момент все накрывается медным тазом
Debug Assertion failed! и т.д.


наверное нужно как-то синхронизировать основной поток и этот, в котором обновляется инфа
но как?....
Записан

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

us
Offline Offline

« Ответ #1 : 07-10-2003 13:27 » 

может делать через асинхронные сокеты?..
только я об этом пока только слышал..
чуть-чуть :oops:
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 07-10-2003 13:30 » 

Используй любой метод синхронизации. Напр. послать этой форме сообщение - это будет проще всего.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sommer
Молодой специалист

us
Offline Offline

« Ответ #3 : 07-10-2003 14:27 » 

Цитата: RXL
Напр. послать этой форме сообщение - это будет проще всего.

а как можно послать форме сообщение?...
Записан

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

ru
Offline Offline

WWW
« Ответ #4 : 07-10-2003 15:42 » 

SendMessage() или PostMessage() Улыбаюсь
Записан

Megabyte be with you!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 07-10-2003 15:54 » 

Бр Бр Бр...

Что то я не врублюсь...Никакой связи нет к синхронизации потоков и этой ошибке.

1. Приведи полностью вид ошибки...
2. Выложи код.

Мои мысли...
Передавать данные в виде указателя потоку, это хорошо, и никакой ошибки не произойдет если ты их изменишь.
Меня интересует как ты берешь указатель формы???

И еще одно - есть функция SetWindowText которая выведет данные в EDIT контроль, без UpdateData(false).

Передавать можно только PVOID pParam при старте потока, а как можно передать потоку другой указаетль в процессе его функционирования??? Может в этом зарыт смысл???
Записан

А птичку нашу прошу не обижать!!!
Sommer
Молодой специалист

us
Offline Offline

« Ответ #6 : 07-10-2003 19:22 » 

Гром,
я беру не указатель формы, а переменной которая "ассоциирована"(не знаю правильное слово для этого случая)с формой
после того как ввставили форму в диалоговое окно нужно создать какую-нибудь переменную, через которую бы мы могли изменять значение в этой форме
создана переменаая CString m_dataIn;(все это в визарде делается)

создаю поток
Код:

hThreads[0( = )HANDLE: _beginthreadex)NULL,0,receiveData, &data_ch2,0,&uThreadIDs[0(:;


функция для потока
Код:


struct ch2 |
    SOCKET * my_sock;
    CDialog * cdg;
    CString * str;
";




unsigned __stdcall receiveData )void * arg: |

   
    ch2 * data_ch2 = )ch2*:arg;

    // ????? ????????? ? ???????
    char buff[10*1014(;
    sockaddr_in server_addr;
    int server_addr_size=sizeof)server_addr:;
    int n;

    sockaddr_in client_addr;
    int client_addr_size = sizeof)client_addr:;
   
    HOSTENT *hst;

    while)1: |        
        n=recvfrom)*)data_ch2->my_sock:,&buff[0(,sizeof)buff:-1,0,
            )sockaddr *: &server_addr, &server_addr_size:;
     
        if )n != SOCKET_ERROR: |
            buff[n(=0;

            *)data_ch2->str: += )CString:buff;
           data_ch2->cdg->UpdateData)false:;//в этом-тоо месте дебаггер все и останавливает
           
           
        "
    "
    _endthreadex) 0 :;
   
"


перед созданием потока формирую пепредаваемый ему аргумент:
Код:


    data_ch2.my_sock = &my_sock;
    data_ch2.str = &m_dataIn;
    data_ch2.cdg = this;// CDialog
Записан

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

us
Offline Offline

« Ответ #7 : 07-10-2003 21:24 » 

нашел корявый выход:

data_ch2->cdg->SetDlgItemText(IDC_EDIT2,*(data_ch2->str));
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #8 : 07-10-2003 21:30 » 

Я звтра тебе проектик сделаю как пример ОК...
Записан

А птичку нашу прошу не обижать!!!
Sommer
Молодой специалист

us
Offline Offline

« Ответ #9 : 07-10-2003 21:46 » 

Гром,
огромное спасибо ))

p.s.
лабу сдавать часов через 8(я делаю лабу)
ну я лабу сдам - за меня не волнуйтесь ) (программу минимум я сделал)
кстати, хотите выложу варианты заданий к лабам? (их ~ 5-6)
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Serega
Гость
« Ответ #10 : 08-10-2003 06:29 » 

Потоку передаешь HWND контрола, и постишь контролу мессагу WM_SETTEXT
Код:
CString str; 
PostMessage) hWndControl, WM_SETTEXT, NULL, )LPCTSTR: str :;
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #11 : 08-10-2003 08:00 » 

Вот собственно и все.
http://shelek.org.ru/proc.zip
Качать всем кто хочет.
На окошечке 1 EDIT контроль и кнопка Botton 1.
При нажатии на кнопку запускается тред, и считает от 1 до 99 цмферки выводя их в окошко - нет там ни посылок сообщений ни каких то других извратов с синхронизациями.

Просто SetWindowText.

Удачи всем.
Записан

А птичку нашу прошу не обижать!!!
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #12 : 08-10-2003 08:54 » 

Гром, Вчера наткнулся на такую же гадость.
Если передавать указатель на диалог как параметр для функции потока, то он ругается на вызов UpdateData(). Доступ к переменным работает отлично. Да и остальные функции вызываются.
Чего-то там есть с передачей указателей.
Записан

Megabyte be with you!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #13 : 08-10-2003 09:05 » 

Я передаю указатель...
Но при этом видимо грабли я понимаю вот в чем.
UpdateData специфична для диалога.
При передаче указателя лучше использовать CWnd как основу,  в моем примере я передаю указатель на переменную CEDit которую привожу к CWnd и там вызываю SetWindowText...
Записан

А птичку нашу прошу не обижать!!!
NetRaider
Гость
« Ответ #14 : 08-10-2003 09:07 » 

Нельзя UpdateData вызывать из потока, который не создавал твой диалог.
Посылай диалогу сообщение SendNotifyMessage(), а в обработчике этого сообщения UpdateData.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 08-10-2003 09:35 » 

Цитата: Гром
нет там ни посылок сообщений ни каких то других извратов с синхронизациями.

Просто SetWindowText.



Ну тут ты не прав, а что по твоему в SetWindowText происходит?
Смотрим MSDN:

If the target window is owned by the current process, SetWindowText causes a WM_SETTEXT message to be sent to the specified window or control.

Поддержу RXL - посылка сообщений - самый простой способ "общения" между тредами. И думаю, что в лабе акцент был поставлен именно на синхронизацию тредов.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #16 : 08-10-2003 11:19 » 

Не совсем так.
PostMessage & SendMessage не занимаются синхронизацией данных в процессах...
Я говорил именно о синхронизациях, посылка самих сообщений - дело 0-е ИМХО.
RXL - прав - я не спорю - ответ таков - если есть удобная функция зачем писать сообщение - буковок больше Улыбаюсь

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

А птичку нашу прошу не обижать!!!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 08-10-2003 12:48 » 

Цитата: Гром
если есть удобная функция зачем писать сообщение - <b>буковок больше</b> Улыбаюсь


Эт точно!  Улыбаюсь
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #18 : 08-10-2003 13:23 » 

Это в каком же институте лабы делают с окошками и про окошки? Что за предмет такой?
Вобще рвать надо таких препов. Изучать потоки на Винде!
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #19 : 08-10-2003 13:31 » 

SlavaI,  Отлично
Записан

А птичку нашу прошу не обижать!!!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 08-10-2003 13:42 » 

Про акцент лабы - эт я предположил просто, хотя тоже не совсем понимаю зачем это надо. Помните у Ильфа и Петрова: "Пустыня - это бездарно! Но она существует и с этим приходится считаться."
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sommer
Молодой специалист

us
Offline Offline

« Ответ #21 : 08-10-2003 15:56 » new

Цитата: SlavaI
Это в каком же институте лабы делают с окошками и про окошки? Что за предмет такой?
Вобще рвать надо таких препов. Изучать потоки на Винде!

мое задание

Цель работы: разработать чат с централизованным сервером.

Чат – это программа для обмена пользователей, расположенных на различных компьютерах, текстовыми сообщениями.
В такой конфигурации сервер содержит таблицу активных клиентов и управляет ее содержимым – добавление/удаление клиентов в таблицу. Сервер является, по сути, диспетчером сообщений между клиентскими приложениями.
В задачу клиентского приложения входит отображение входящих сообщений (формат отображения произвольный) и отсылка исходящих сообщений. Также клиент должен предоставлять пользователю информацию об остальных клиентах.
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines