Вопрос № 77585: Здравствуйте, уважаемые эксперты!
Появилась у меня к Вам серия вопросов. Использую исключительно WinApi и языки C/C++:
1)как можно средствами С/С++ обратиться к элементу структуры, исключая обращения вида:
mystruct.a и (&mystru...Вопрос № 77587: Здраствуйте!!! Данна задача в ней допушена ошибка, надо найти и исправить. помогите пожалуста, то вроде уже все расписал, все должно работать а все равно не работает!!
задача такая: создать два потока, первый поток отслеживает изменение в папке, ...Вопрос № 77667: Здравствуйте, уважаемые эксперты.
Тема вопроса: трассировка стека.
Приложение написано и скомпилировано в релизе.
Если происходит какая-то ошибка, возможно ли узнать состояние стека, чтобы выяснить место возникновения ошибки? Или люб...Вопрос № 77673: Visual C++ 6.0
При попытке скомпилировать пишет:
Linking...
MSVCRTD.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/fr.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe....
Вопрос № 77.585
Здравствуйте, уважаемые эксперты!
Появилась у меня к Вам серия вопросов. Использую исключительно WinApi и языки C/C++:
1)как можно средствами С/С++ обратиться к элементу структуры, исключая обращения вида:
mystruct.a и (&mystruct)->a
(наподобие того, как это делается при обращении к параметрам функции с переменным числом аргументов)?
2) Элемент управления ListView:
а) можно ли в нём некоторые элементы списка делать многострочными
б) каким образом можно организовать наличие в ListView дочерними другие элементы управления
(например, чтобы при щелчке по какой-нибудь ячейке, в ней появлялся ComboBox)
3) Элемент управления RichEdit:
не могли бы Вы подсказать источник, в котором доступно была бы изложена работа с этим элементом
управления, используя исключительно WinApi.
Отправлен: 09.03.2007, 01:08
Вопрос задал: VSP (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Tek
Здравствуйте, VSP!
1) Собственно элементы структуры располагаются в памяти друг за другом, так что зная адрес структуры и ее структуру (сорри за тавтологию :)) можно делать memset и memcpy например. Только зачем - я честно не могу представить структуру с переменным числом полей. Если не сложно и не секретно в минифоруме расскажите для чего это нужно пожалуйста.
2)Насколько я знаю ListView - элемент колонки не умеет вписывать текст расширяясь. Это можно организовать только ручками.
Дочерние элементы можно создавать в ответ на некоторые сообщения окна ListView или нотификации его родительского окна. Просто создавать например так:
CreateWindow("Edit", "", WS_CHILD, x, y, w, h, hwndListView, (HMENU)10001, hInst, NULL), то есть этот контрол должен иметь стиль WS_CHILD и родителем иметь сам ListView. Вообще тема редактирования например отдельных элементов и субэлемнтов ListView у меня в свое время заняла пару недель, так что в двух словах ее не изложишь. Если очень важно, могу выслать пример диалога с такой ListView - правда попробовать не получится она без БД не заработает, но с принципом разобраться можно.
3) Собственно в MSDN - например на сайте Microsoft - самый подробный и доступный источник. Если же проблемы с английским может подойдет www.rsdn.ru
--------- WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 09.03.2007, 12:08
Отвечает: Ilkras
Здравствуйте, VSP!
1. Поскольку в С++ структура является классом, то можно реализовать функции Get/Set для каждого элемента структуры.
Ответ отправил: Ilkras (статус: 3-ий класс)
Ответ отправлен: 09.03.2007, 23:45
Вопрос № 77.587
Здраствуйте!!! Данна задача в ней допушена ошибка, надо найти и исправить. помогите пожалуста, то вроде уже все расписал, все должно работать а все равно не работает!!
задача такая: создать два потока, первый поток отслеживает изменение в папке, а второй регулярно пытается удалить файл с раширением txt.
выполнял на VS C++ 6.0
Дано
Edit box m_EDir // рабочий каталог
Button1 // запускает два потока
Button2 // останавливает дейсвие потоков
List box - m_List; //Суда заноситься выводимая информация
Сообщение WM_MyRedraw вызывает функцию OnSample
(вроде описано правильно
UINT WM_MyRedraw=RegisterWindowMessage("MESSAGE_MyRedraw");
...
ON_REGISTERED_MESSAGE(WM_MyRedraw,OnSample)
...
и в заголовочном
afx_msg LRESULT OnSample(WPARAM wParam,LPARAM lParam);)
Короче запустить мне ее удалось, но работает не коректно а имено не работает остановка потоков.
Приложение:
Отправлен: 09.03.2007, 01:44
Вопрос задал: HITY (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Ross
Здравствуйте, HITY!
Попробуйте использовать стандартные api-шные функции:
Ответ отправил: Ross (статус: 6-ой класс)
Ответ отправлен: 09.03.2007, 10:24 Оценка за ответ: 3 Комментарий оценки: Функции впринципе я знаю но как их исп в моей проге??
Отвечает: Tek
Здравствуйте, HITY!
У вас же не предусмотрен выход из потоковых процедур Thread1 и Thread2 вобще никак. Обе крутят бесконечный цикл for (;;). Его же когда то надо останавливать, иначе потоки корректно не завершатьтся. Классически самым лучшим (читай правильным) завершением потока есть самостоятельный выход из потоковой прцедуры по return. Намного хуже, но тоже в крайнем случае можно использовать EndThread - AFXEndThread - функция вызывается из потоковой процедуры и вызывает досрочное завершение потока - при этом не отрабатывает
стандартная функция завершения потока и не освобождаются данные и память, использованые потоком. То же самое только извне - прекратить поток можно функцией TerminateThread как вам уже предложили - отличается от EndThread только тем что должна вызываться из других потоков.
Ну а теперь о классическом. :)
Я обычно делаю следующим образом: завожу глобальную переменную, перед созданием потока выставляю ее например в 1; в потоке крутиться цикл пока эта переменная равна 1 а перед самым выходом из потоковой процедуры устанавливаю в 3(нужно для ожидания окончательного завершения потока).
Завершение потока из-вне соответственно происходит следующим образом:
в любом месте кода где требуется завершить поток, эта переменная выставляется в 2 и затем циклом жду пока она станет равна 3 - после этого поток завершен - и можно разрушать его дескриптор CloseHandle(HANDLE).
--------- WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 09.03.2007, 11:40 Оценка за ответ: 5 Комментарий оценки: Не совсем то что я хотел но вы наталкнули на интересную мысль нужно поробывать и вашим способом и своим!!!
Отвечает: Ilkras
Здравствуйте, HITY!
Остановка потоков действительно не работает - она не реализована или реализована неправильно.
В первом потоке у вас бесконечный цикл без выхода. Во втором потоке - выход по ошибке файловой операции.
Как починить: в первом потоке обрабатывать ошибку функции ожидания и по этой ошибке выходить, во втором потоке добавить функцию ожидания на том же хэндлере что и в первом потоке, но с небольшим таймаутом и выходить тоже на ошибке.
Ответ отправил: Ilkras (статус: 3-ий класс)
Ответ отправлен: 09.03.2007, 23:42 Оценка за ответ: 5 Комментарий оценки: Тоже интересный вариант!!!
Приложение написано и скомпилировано в релизе.
Если происходит какая-то ошибка, возможно ли узнать состояние стека, чтобы выяснить место возникновения ошибки? Или любую другую информацию, всё пригодится!
Причём одно из главных требований - кроссплатформенность (приложение на Qt написано). Если средствами WinAPI, то я знаю как, видел статьи по этому поводу. Но нужно, так сказать, кроссплатформенный способ.
Возможно ли это, может есть готовая библиотека, о которой я не знаю?
Отправлен: 09.03.2007, 15:58
Вопрос задал: V1s0r (статус: 2-ой класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Хватов Сергей
Здравствуйте, V1s0r!
Судя по всему кросспратформенно это невозможно.
Не знаю как под MS-Windows, но linux как и любой unix в случае краха процесса может записать на диск его образ, который потом можно проанализировать отладчиком.
Даже если программа собрана с максимальной оптимизацией кое-что всё равно можно узнать. Но уж если она собрана с сохранением отладочной информации (это сильно отражается на её размере но не очень - на производительности) - всё можно увидеть в терминах исходных текстов.
В любом случае - всё это доступно если стек не загажен. А серьёзные ошибки (а они далеко не самые редкие - только один висячий указатель сможет это сделать) могут привести к разрушению содержимого стека так что не поможет уже ничего
Ответ отправил: Хватов Сергей (статус: Студент)
Ответ отправлен: 09.03.2007, 16:48 Оценка за ответ: 5 Комментарий оценки: Спасибо, не надеялся, что есть такой способ. Возможно, придётся писать что-то вроде #if defined LINUX ... #elif defined WINDOWS ...
Отвечает: kool
Здравствуйте, V1s0r!
Да скорее всего в отладчике.
Находим регистр esp и - ОППА состояние стека.
Скорее всего эта ошибка - запись данных в
невыделенную область памяти.
Можно повнимательнее глянуть текст проги.
Удачи!
--------- I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 09.03.2007, 18:46
Отправлен: 09.03.2007, 16:44
Вопрос задал: Markello (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: kool
Здравствуйте, Markello!
И правильно пишет.
Внимательно заново создайте проект
именно того типа к которому относится
текст вашей программы.
Скорее это проект типа "Приложение Win32"
Удачи!
--------- I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 09.03.2007, 18:46