C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
потоки и глобальные переменные
Benish
Отправлено: 08.10.2004, 16:24


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Описаны 2 глобальные переменные:

volatile bool tTst=false, tBadp=false;

в остальных файлах они описаны как:

volatile extern bool tTst, tBadp;

Если изменять их значение при обявлении, то в потоках эти изменения
видны. Если изменять их значения из программы, изменения видны в отладчике, но в потоках ветки которые должны отрабатывать при значениях true — не отрабатывают. При объявлении через класс — все работает. Но хочется работать без указателей.
Может я что-то не так делаю?
timson
Отправлено: 08.10.2004, 17:32


Станционный диспетчер

Группа: Участник
Сообщений: 82



а попрбуй без volatile. че-та это фича мне не нравится...
Георгий
Отправлено: 08.10.2004, 18:19


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



да не — без volatile будет глючить, например вот такое:
CODE
while(tTst);

быть может случайно оказалось, что главный поток и дополнительные работают с разными копиями переменной — её экземпляр точно объявлен в одном месте?
Guest
Отправлено: 11.10.2004, 10:18


Не зарегистрирован







Похоже что объявлен, но вот как — понятия не имею.
Вот что у меня написано:

Umain.h
CODE

volatile bool tTst=false, tBadp=false;


Uthread.h
CODE

#include "Umain.h"
extern volatile bool tTst, tBadp;


Uthproc.h
CODE

#include "Umain.h"
extern volatile bool tTst, tBadp;


Uthwrite.h
CODE

#include <Umain.h>
extern volatile bool tTst, tBadp;


С помощью поиска проверил, больше нигде объявлений — нет.

НО!! При компиляции есть такие варнинги:
CODE

[Linker Warning] Public symbol '_tTst' defined in both module UMAIN.OBJ and UTHREAD.OBJ
[Linker Warning] Public symbol '_tTst' defined in both module UMAIN.OBJ and UTHPROC.OBJ
[Linker Warning] Public symbol '_tBadp' defined in both module UMAIN.OBJ and UTHREAD.OBJ
[Linker Warning] Public symbol '_tBadp' defined in both module UMAIN.OBJ and UTHPROC.OBJ
[Linker Warning] Public symbol '_tTst' defined in both module UTHREAD.OBJ and UTHPROC.OBJ
[Linker Warning] Public symbol '_tBadp' defined in both module UTHREAD.OBJ and UTHPROC.OBJ


Причем, что интересно, обратите внимание, что в варнингах не упоминается модуль Uthwrite.h и самое главное, что в этом модуле глобальная переменная отрабатывает нормально!!!! Копирование строк extern из модуля Uthwrite.h в остальные ничего не дает sad.gif
Вообщем ничего не понятно sad.gif sad.gif sad.gif
Benish
Отправлено: 11.10.2004, 11:22


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Все! Разобрался!

Я с #include напортачил. Привел во всех юнитах #include в порядок и все стало ОК. Ура! biggrin.gif

Но все равно СПАСИБО всем.
Георгий
Отправлено: 11.10.2004, 11:43


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



жуть.
я б экземпляр переменной объявил не в hpp файле, а в cpp, а в hpp таскал бы только extern обявление.
Guest
Отправлено: 12.10.2004, 11:36


Не зарегистрирован







Ага. Я приблизительно так и передалал.

Вернуться в Вопросы программирования в C++Builder