Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 681
от 15.03.2007, 01:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 462, Экспертов: 44
В номере:Вопросов: 4, Ответов: 8


Вопрос № 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-шные функции:

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);

BOOL TerminateThread(
HANDLE hThread, // handle to thread
DWORD dwExitCode // exit code
);

Sample:
DWORD lpThreadId;
HANDLE th1HANDLE = CreateThread(NULL, NULL, Thread1, NULL, NULL, &lpThreadId);
Ответ отправил: 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
Комментарий оценки:
Тоже интересный вариант!!!


Вопрос № 77.667
Здравствуйте, уважаемые эксперты.
Тема вопроса: трассировка стека.

Приложение написано и скомпилировано в релизе.
Если происходит какая-то ошибка, возможно ли узнать состояние стека, чтобы выяснить место возникновения ошибки? Или любую другую информацию, всё пригодится!

Причём одно из главных требований - кроссплатформенность (приложение на 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


Вопрос № 77.673
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.

fr.exe - 2 error(s), 0 warning(s)
Отправлен: 09.03.2007, 16:44
Вопрос задал: Markello (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Markello!
И правильно пишет.
Внимательно заново создайте проект
именно того типа к которому относится
текст вашей программы.
Скорее это проект типа "Приложение Win32"
Удачи!


---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 09.03.2007, 18:46


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.45 beta от 20.02.2007
Яндекс Rambler's Top100

В избранное