| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > THREAD и глобальные переменные |
| Автор: dahilu 22.8.2012, 10:19 | ||||||||
Main.h
Main.cpp
MyTHRD.h
MyTHRD.cpp
Компилируется но выводит в Label1 0 выдает предупреждение что она объявлена в двух модулях: Public symbol '_VarA' defined in both module C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TESTTHREAD\MAIN.OBJ and C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TESTTHREAD\MYTHRD.OBJ Как убрать ошибку и как тогда обратится к VarA и OutputVarA(); из потока? Почему если #include "MyTHRD.h" и MyTHRD *MyT; сделать в Main.h будет выдаваться ошибка [C++ Error] Main.h(24): E2141 Declaration syntax error? |
| Автор: borisbn 22.8.2012, 10:30 |
| 1) В h-никах делают только объявление, а описание делают в cpp-шниках. Перенеси int VarA; в main.cpp, а в main.h сделай extern int VarA; (и в MyTHRD.h он уже не нужен. 2) К VCL-ным компонентам запрещено обращаться из доп.потоков, а ты это делаешь для этого существует метод TThread::Synchronize() 3) (не в обиду) Рановато тебе заниматься потоками, если не умеешь объявлять и описывать переменные... ИМХО, ессно |
| Автор: dahilu 22.8.2012, 12:25 | ||
Спасибо за ответ, я попробовал, все заработало. но у меня все равно есть вопросы: Почему я должен переносить объявление переменной VarA в Main.cpp? Разве объявления в Main.h некорректно? Из книги архангельского (стр 52 1 абзац) я понял что спецификацию extrern надо писать в модуле куда подключаю, в данном случае, Main.h, или это с потоками не работает?или я не правильно понял когда надо использовать extern? |
| Автор: dahilu 24.8.2012, 09:38 | ||||||
Да учел. единственное есть вопрос, наверно из-за недопонимания как работает Syncronize(): Например есть вот такой поток
В ThreadFunc() выполняются много действий и в середине я обращаюсь к компоненту формы. мне достаточно написать Synchronize(ThreadFunc1) или мне надо написать отдельную функию ThreadSubFunc() в которой будет одно действие (обращение к форме) и тогда уже в ThreadFunc() писать Synchronize(ThreadSubFunc) ? |
| Автор: borisbn 24.8.2012, 10:35 |
| А чем ThreadFunc1 отличается от ThreadSubFunc ? В любом случае тебе потребуется доп.функция для обращения к форме, которую нужно будет вызывать через Синхронайз |
| Автор: mes 26.8.2012, 08:30 | ||
кол-вом действием..
dahilu, чем быстрее функция вызванная в Synchronize(), тем лучше.. |
| Автор: borisbn 26.8.2012, 18:43 |
| Аааа... наверное ТС опечатался. Единица после имени функции лишняя ? |