Выплескивание эмоций

Тема в разделе "Флудилка", создана пользователем alp69, 15 окт 2016.

  1. akl

    akl Гуру

    в кодблоксе с mingw.
    я делал Sleep(1000) - не помогло
     
  2. Igor68

    Igor68 Гуру

    Когда-то всё делал на потоках. И случалось так, что некоторые потоки вообще при ожидании мютекса вообще не оживали. Приходилось всё делать по особому... делал цикличное ожидание мютекса и ожидание с инкрементом и декрементом в каждом из потоков. Таким образом все потоки устаканивались и работали. Сейчас применяю только процессы(автономные программы) с обменом данными между собой, а потоки очень не часто.
     
  3. akl

    akl Гуру

    мне поток нужен чтобы когда что-то приходит в ком-порт он напихивал это в буфер, а основная программа брала из этого буфера и использовала. Соответственно надо сделать чтобы они не могли трогать буфер одновременно. Думаю может ваще нафиг эти мьютексы и сделать как-то по тупому типа через глобальную переменную
     
  4. Igor68

    Igor68 Гуру

    А кто не отпустил мютекс? Вы делали так в тех местах где надо отпускать мютекс?:
    Код (C++):
    .....
    ReleaseMutex(hMutex);
    Sleep(10);
    А отпускать надо везде... и в основной программе и во всех потоках. Тлько где упустишь, там и зависнет
     
  5. akl

    akl Гуру

    у меня только одна основная программа и один поток.
    в потоке делал вот так
    ReleaseMutex(hMutex);
    Sleep(1000);
    но основная программа висит на ожидании как будто поток вообще не делал ReleaseMutex
     
  6. Igor68

    Igor68 Гуру

    Да нет там парллельного доступа. По обработке событий делайте приём как и делали. И таймер прикрутите по нему и будете работать с принятым (как пример). Можно и в цикле потока с интервалом в цикле (как раз Sleep). А при пиёме событие должно захватить мютекс только на время приёма. Я просто читал в потоке (Для windows ce).
     
  7. Igor68

    Igor68 Гуру

    считайте какждый захват и отпускание мютекса во сех местах. Как пример цикл в программе начинается заново, но сам не отпустил мютекс (сам захватил и сам ожидает его освобождения). А перед этим надо сначала освободить
     
    akl нравится это.
  8. Igor68

    Igor68 Гуру

    а это:
    Код (C++):
    //в треде цикл
    while(connected){
        //тред ждет пока освободится мьютекс
        WaitForSingleObject(hMutex, INFINITE);
        //делает всякое
        //при определенных условиях отправляет в основную программу сообщение
        if(dwReaded>0){
             PostMessage(hwnd_d,COM_RX,0,dwReaded);
             //и высвобождает мьютекс
             ReleaseMutex(hMutex);
        }
    }
    вот это
    Код (C++):
    PostMessage(hwnd_d,COM_RX,0,dwReaded);
    вы в потоке делаете анализ сообщения которое
    Код (C++):
    //основная программа получив сообщение от треда
    case COM_RX:
         //ждет пока тред отпустит мьютекс
         WaitForSingleObject(hMutex, INFINITE);
         //после чего дико овладевает мьютексом и делает свои дела
         //по окончании отпускает мьютекс и так далее.
         ReleaseMutex(hMutex);
    ждёт этот мютекс, а освобождать кто будет?
     
  9. akl

    akl Гуру

    я короче понапихал резизмютексов() в еще пару мест и заработало как надо вроде. Буду теперь пытаться разобраться почему оно так получилось:D
    спасибо за помощь!
     
  10. akl

    akl Гуру

    надо всего лишь в треде два раза подряд сделать ReleaseMutex
    почему так - не очень понимаю.


    ААА всё понял. у меня же в этом же треде еще в самом начале, до цикла было ожидание мьютекса и его занятие соответственно. Я то не шарю и думал что однократное ReleaseMutex освобождает его полностью, а оно видимо должно быть вызвано ровно столько раз сколько было вейтсинглобжектов.
     
    Последнее редактирование: 26 ноя 2019
  11. Igor68

    Igor68 Гуру

    считайте захваты прямо по последовательности:
    захватил
    .....
    отпустил
    и если втречается условие после захвата, то надо убедиться что мютекст будет отпущен при любом условии. Это всё не сложно, но кропотливо.
     
    akl нравится это.
  12. parovoZZ

    parovoZZ Гуру

    а не послать ли в бан @baan2003 ?
     
    Airbus и NikitOS нравится это.
  13. NikitOS

    NikitOS Король шутов Администратор

    Хорошая мысль :)
    В профиле сплошная реклама, тут политику обсуждаем... Сплошные нарушения...
    Одно предупреждение уже есть, надо добить
     
    Airbus нравится это.
  14. Airbus

    Airbus Радиохулиган Модератор

    Ф топку его!
     
  15. asam

    asam Гик

    Мьютексы используюся когда несколько потоков обращаются к одному и тому же рессурсу. В вашем же случае надо просто просигналить из одного потока в другой, а для этого лучше использовать PulseEvent - https://docs.microsoft.com/en-us/windows/win32/sync/using-event-objects
     
    akl нравится это.
  16. akl

    akl Гуру

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

    Igor68 Гуру

    Так сделайте два потока... один контролирует порт и принимает в буфер, другой анализирует принятое в буфере... ну а основная программа ещё что-то делает. А мютекс не обязательно сразу захватывать... а только при доступе к общим для всех потоков данным.
     
  18. akl

    akl Гуру

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

    NikitOS Король шутов Администратор

    «Картинки доходчивее, вставляй их!»
     

    Вложения:

    • rs-Q_bs2TcU.jpg
      rs-Q_bs2TcU.jpg
      Размер файла:
      231,5 КБ
      Просмотров:
      203
    ИгорьК нравится это.
  20. ИгорьК

    ИгорьК Гуру

    :))))))))))))))