Вопрос № 29687: Подскажите кто-нибудь. диалоговое приложение на VC++(MFC).
Есть два потока-главный и дополнительный. Дополнительный поток запускается при обработке одной из кнопок главного окна. Второй поток, при определенных условиях, генерирует сообщение и пер...Вопрос № 29698: Проблема с исходниками к MySQL. Сам mysql 4.1.14 - скачал вместе с исходными кодами под окошки. При компиляции этого кода (код из книги для проверки работы с mysql):
#include <stdio.h>
#include <mysql.h>
int main() {
..Вопрос № 29712: Уваж. Эксперты!!!
У меня к Вам просьба помогите пожалуйста! Мне начальство просить писать проги на Visual Си, у меня есть опыт работы на Дельфи7, Вопрос такой есть ли в Визуал Си такой же панель иснтрументов(button memo, label, stringrid и тд) ка...
Вопрос № 29.687
Подскажите кто-нибудь. диалоговое приложение на VC++(MFC).
Есть два потока-главный и дополнительный. Дополнительный поток запускается при обработке одной из кнопок главного окна. Второй поток, при определенных условиях, генерирует сообщение и передает его главному окну приложения, которое тот должен обработать. И вот здесь я столкнулся с одной странной проблемой: При обкатке версии debug-приложение работает без сбоев. А при выполнении версии Release-при первой посылке сообщения второго потока окну на обработку-все происходит нормально, а после второй посылки-программа
слетает.
Вот текст сообщения:
Инструкция по адресу "0х6с291351" обратилась к памяти по адресу "0х0000048с".
Память не может быть"read".
Не понимаю, почему debug-версия не показевает ни каких ошибок, а релиз-слетает, причем не понятно, где ловить ошибку. Ниже приведены части кода, имеющие отношение к вопросу.
Приложение:
Отправлен: 16.11.2005, 23:49
Вопрос задал: Stanly (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: estiGi
Здравствуйте, Stanly!
То , что релиз слетает, дык это обычное явление :)
По коду вроде все ок. Кстати, где именно падает? Надо наверное показать весь код и место, в котором вылетает. В релизе тоже можно пройтись по коду (если не ниже VC 7.1).
Ошибка похожа на выход за границы массива, что в дебаг версии может и не обнаружиться. Может, ошибка совсем и не в потоках. Еще есть вариант, что ты используешь одновременно одну переменную в обоих потоках и где то случилась кака.
Ответ отправил: estiGi (статус: 7-ой класс)
Отправлен: 17.11.2005, 00:14
Отвечает: Юрицын Андрей Андреевич
Здравствуйте, Stanly!
Я вот тут почитал умную книжку (Visual C++ .NET Тома Арчера) и кажется знаю как можно исправить ситуацию.
Возможно проблема в строке "::PostMessage(h,WM_TOTAL,0,0)". Если это так, то скорее всего функция PostMessage в своей работе использует поиск указателя окна по его дескриптору (то бишь h). Поиск этот соуществляется в локальной таблице дескрипторов (в ней прописано соответсвие хендлам-дескрипорам указателей на окна) которая для каждого потока своя. Так как окно диалога было создано в главном потоке, то и в его таблице дескрипторов есть соответствующая запись. В таблице же второго потока такой записи
нет, вот он и не может прочесть.
Относительно вышесказанного я могу и жестоко заблуждаться, но других идей у меня нет. Подумайте.
Что касается нормальной работы в режиме debug, то это объясняется тем, что в комплект поставки Visual C++ входит шесть версий динамической библиотеки С, половина из них thread-safe (потокобезопасна, то есть защищает программиста от подобных козней, расходуя при этом дополнительную память), другие три обычные не защищенные, но именно одна из них используется при компиляции release, обеспечивая оптимизацию по памяти.
Автор книги советует никогда не передавать указатели на объекты (в данном случае на диалог) в другие потоки, но передавать только их дескрипторы (хендлы). Если же необходимо знать указатель на окошко CWnd то после получения его дескриптора во втором потоке нужно вызвать FromHandle.
Например так:
CWnd *pWnd = CWnd::FromHandle( (HWND)pParam )
Эта функция воссоздаст в локальной таблице дескрипторов текущего потока, необходимую запись.
Итого. Попробуйте передать в рабочий поток в качестве параметра не указатель на диалог, а сразу хендл его окна. Если и при этом будет происходить ошибка, тогда перед вызовом PostMessage сделайте вызов FromHandle как указано выше. Надеюсь этот совет поможет.
Отвечает: Raptor1
Здравствуйте, Stanly!
Возможно у тебя эта функция из потока слишком часто вызывается, до того как отработала вызванная ранее и портит какие то данные класса. DEBUG версия работает медленнее поэтому проблема не проявляется. Чтобы отследить в релизе где происходит сбой используй какие то контрольные точки, например сохранение в файл строки.
Ответ отправил: Raptor1 (статус: 9-ый класс)
Отправлен: 18.11.2005, 00:02
Вопрос № 29.698
Проблема с исходниками к MySQL. Сам mysql 4.1.14 - скачал вместе с исходными кодами под окошки. При компиляции этого кода (код из книги для проверки работы с mysql):
#include <stdio.h>
#include <mysql.h>
int main() {
MYSQL mysql;
mysql_init(&mysql);
mysql_real_connect(&mysql, NULL, NULL, NULL, NULL, 0, NULL, 0);
mysql_close(&mysql);
}
Начинает ругаться по поводу непонятного объявления в mysql_com.h, а именно на my_socket fd, в комментах написано что это нужно для интерфейса DBI в Perl. Если же ему подсунуть my_global.h в котором объявлен my_socket, то выдает следующие обшики при линковке, при компиляции все нормально:
Unresolved external 'mysql_init' referenced from E:C++TEMPMYSQL.OBJ
Unresolved external 'mysql_real_connect' referenced from E:C++TEMPMYSQL.OBJ
Unresolved external 'mysql_close' referenced from E:C++TEMPMYSQL.OBJ
То же самое будет если самому внести изменения в mysql_com.h добавив туда typedef int my_socket. Вообщем странно все это, кто-нибудь знает в чем здесь проблема и самое главное как ее исправить ? Пробовал на разных компиляторах, и на VC 6.0 и на borland 5.0 и под юниксом gcc. Именно эти 3 ошибки, хотя под никсом по другому было написано, но очень похоже я точно не помню, но тоже указывались все 3 функции и ошибки.
Отправлен: 17.11.2005, 07:27
Вопрос задал: RedDevil (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Jadd
Здравствуйте, RedDevil!
Все эти ошибки могут говорить о том, что Вы не указали путь к хэдерам (.h) и/или либам (.lib). Нужно в опциях (в VC++) указать пути к инклюдам. Возможно это поможет решить сложившуюся проблему.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 17.11.2005, 11:19
Вопрос № 29.712
Уваж. Эксперты!!!
У меня к Вам просьба помогите пожалуйста! Мне начальство просить писать проги на Visual Си, у меня есть опыт работы на Дельфи7, Вопрос такой есть ли в Визуал Си такой же панель иснтрументов(button memo, label, stringrid и тд) как в Дельфи или Визуал Бейсик. если есть то как его вытащить а то в самоучителях только через мастера показали.
Отправлен: 17.11.2005, 12:27
Вопрос задал: ERA (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Jadd
Здравствуйте, ERA!
Есть. В редакторе ресурсов. Только потом нужно будет контрол привязать к переменной (читайте про Dinamic Data Exchange) или обращаться через указательно CWnd. Тут был подобный вопрос, поищите. Если совсем в ступор, пишите в мыло.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 17.11.2005, 12:34
Отвечает: Юрицын Андрей Андреевич
Здравствуйте, ERA!
Есть конечно. Однако наиболее богата эта панель в Visual Studio .NET Называется она Toolbox и вытаскивается из меню View->Toolbox (Ctrl + Alt + X)
Отвечает: Мухамедзянов Геннадий
Здравствуйте, ERA!
Попробуйте Лучше C++Builder у него интерфейс с Delphi схож...
--------- Это очень интересно... надо разобраться!!!
Ответ отправил: Мухамедзянов Геннадий (статус: 4-ый класс)
Отправлен: 18.11.2005, 17:33