|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.04.2019, 09:48 | #1 |
Форумчанин
Регистрация: 19.05.2009
Сообщений: 153
|
Трудности с работой потока
У меня вызывается поток с помощью функции _beginthreadex. При этом потоковая функция при вызове _beginthreadex--MyThreadFunc. Эта функция MyThreadFunc вызывает функцию MyInnerThreadFunc, в которой и выполняются все действия.
При этом в функции MyInnerThreadFunc происходит проверка на значение переменной *threadflag. (Значения переменной *threadflag: 0--завершить вычисления (т.е. завершить выполнение потока), 1--делать вычисления (т.е. выполнять поток), 2--приостановить вычисления (т.е. приостановить выполнение потока) ). Перед запуском потока переменной *threadflag было задано значение 1--выполнять поток. Но внутри функции MyInnerThreadFunc в одном из мест проверки значения переменной *threadflag оказывается, что это значение равно 0, хотя внешне поток ниоткуда не прерывался. И как следствие этого--происходит выход из функции MyInnerThreadFunc, завершение работы MyThreadFunc и завершение работы потока. В чём причина этого? Как сделать так, чтобы значение переменной *threadflag не менялось внутри функции MyInnerThreadFunc, если внешне не было команды завершить поток? Код: Код:
|
11.04.2019, 09:50 | #2 |
Форумчанин
Регистрация: 19.05.2009
Сообщений: 153
|
Код (продолжение):
Код:
|
11.04.2019, 09:51 | #3 |
Форумчанин
Регистрация: 19.05.2009
Сообщений: 153
|
Код (окончание):
Код:
|
11.04.2019, 12:17 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,493
|
Во первых, не путайте volatile int * и int * volatile.
Во вторых, если вы не меняли содержимое указателя но данные изменились, то значит изменился сам указатель, либо изначально указывает не туда, куда надо. Поскольку явно не умеете пользоваться отладчиком просто печатайте на консоль сам адрес и его содержимое. И последнее - сделайте маленький проект, который ничего не делает кроме потоков - будет легче разбираться что и как... |
11.04.2019, 12:24 | #5 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,695
|
Вы в поток передали указатель на локальную стековую переменную и надеетесь, что она не изменится. Серьезно?
|
11.04.2019, 15:03 | #6 |
Форумчанин
Регистрация: 19.05.2009
Сообщений: 153
|
|
12.04.2019, 09:49 | #7 |
Форумчанин
Регистрация: 19.05.2009
Сообщений: 153
|
Я убрал локальную переменную myStruct типа MyStruct, оставил только член класса CCalcDialog поле myStruct типа MyStruct--и поток стал нормально работать.
Но возникла другая проблема. По кнопке "Остановить" на диалоге CalcDialog происходит приостановка действия потока и появляется окно ControlPointDIalog, в котором отображаются данные на текущем шаге вычислений. На диалоге ControlPointDialog находятся кнопки "Сохранить" (пока не работает), "Продолжить" и "Завершить". При нажатии на кнопку "Продолжить" должно произойти продолжение действия потока, а при нажатии на кнопку "Завершить" должно произойти завершение работы потока. Для обработки нажатия обеих этих кнопок написан код, регулирующий действия потока. (Переменная *threadflag при значении 0 означает завершение работы потока, при значении 1 означает выполнение потока, при значении 2 означает приостановку выполнения потока). Однако после того, как была нажата кнопка остановить на диалоге CalcDialog и появился диалог ControlPointDialog с информацией о данных на текущем шаге вычислений, то после нажатия кнопки "Продолжить" или "Завершить" ничего не происходит--окно ControlPointDialog продолжает отображаться на экране, а поток не продолжает своё действие и не завершается. В чём причина этого? Как исправить эту ошибку? код в файле CalcDialog.cpp: Код:
Код:
|
12.04.2019, 09:49 | #8 |
Форумчанин
Регистрация: 19.05.2009
Сообщений: 153
|
код файла ControlPointDialog.cpp:
Код:
|
12.04.2019, 10:31 | #9 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,695
|
А вы посмотрите возвращаемое значение WaitForSingleObject в потоке и значение myevent там.
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Трудности с mvc. | [Grizzly] | PHP | 0 | 26.04.2017 19:45 |
Как получить доступ к методу потока(TThread) из основного потока? | Pcrepair | Общие вопросы Delphi | 3 | 30.03.2013 14:52 |
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 | BEL9ILLI | Общие вопросы Delphi | 3 | 06.12.2011 20:26 |
Как узнать номер потока из самого потока? | GaMeSTeR | Помощь студентам | 0 | 03.12.2010 09:50 |
Thread. проблемы с работой потока. Моментально исчезают созданные в потоке формы. | Casper-SC | Общие вопросы .NET | 3 | 24.04.2010 12:28 |