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

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


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

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

Выпуск № 822
от 16.08.2007, 16:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 511, Экспертов: 67
В номере:Вопросов: 5, Ответов: 13


Вопрос № 97972: Язык: Ц++ ОС: ФрииБСД 5 Проблема: Загадочные утечки при работе с потоками pthread_t. Есть некоторая функция, которая в бесконечном цикле создаёт и запускает потоки, запихивая их в контейнер, например, вектор, и время от времени, напр...
Вопрос № 97980: Здравствуйте эксперты. Подскажите пожалста ответ на вопрос: у меня есть форма приложения и фоном этой формы я хочу задать не просто заливку, а изображение. Я использую компоненту Timage, но картинка закрывает собой подписи полей, ни в свойствах к...
Вопрос № 97984: Здравствуйте, уважаемые Эксперты! Проблема такая: Есть цикл While и он бесконечен, но надо чтобы 1 такт это цикла выполнялся один раз где-то в 5 секунд(не меньше 5 и не больше 10 секунд). Т.е. Цикл выполнился 1 раз подождал секунд 5 и опять выпо...
Вопрос № 98017: Здравствуйте. Помогите, пожалуйста, написать программу на C++. Программа должна производить ряд вычислений и выводить на экран время своего выполнения. Спасибо....
Вопрос № 98025: Здравствуйте уважаемые! Занялся изучением С. Дошел до структур и файлов и натыкаюсь на камни. Вопрос в слудующем: Программа должна считать структуру из файла. Пользуюсь для этого функцией fread(&struct, sizeof(struct), 1, *filepointer) (Из кн...

Вопрос № 97.972
Язык: Ц++
ОС: ФрииБСД 5
Проблема: Загадочные утечки при работе с потоками pthread_t.

Есть некоторая функция, которая в бесконечном цикле создаёт и запускает потоки, запихивая их в контейнер, например, вектор, и время от времени, например, каждые 1000 циклов, обходит этот контейнер, удаляя завершившиеся потоки (здесь под потоками имеются в виду оболочки, оперирующие pthread). Происходит утечка. Причём если модифицировать код так, что поток джойнится сразу после запуска (естественно, при этом он полностью вырабатывает свой функционал), не добавляясь в контейнер, то утечки не происходит.

В результате исследований было обнаружено, что утечка точно не в контейнере (тестировались самые разные, в том числе и собственные) и точно не в оболочке потока. Вывод о том, что утечка не в моей оболочке потока, был сделан по результатам теста, который создаёт и джойнит простые pthread_t.

Привожу код теста. (Код тестирования контейнера точно такой же, только туда добавляются указатели на созданные структурки, которые потом точно так же удаляются из памяти и контейнера (Утечки при этом не происходит.))

Приложение:

Отправлен: 10.08.2007, 17:40
Вопрос задал: Tundravarg (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: estiGi
Здравствуйте, Tundravarg!
Во-первых, не понятно, какого рода утечки происходят. Где утечки, утечки чего...?
Во-вторых, у вас слишком перекрученный цикл, оперирование переменными и контейнером.
И, хотя по коду вроде как все правильно, вас может обмануть сам компилятор, попробовав соптимизировать некоторых места, и вы даже не будtnt подозревать, но программа начинает вести себя некорректно.
Я бы вот что посоветовал. Замените потоки на небольшой класс, а create/join на new/delete. Поставьте в классе счетчик и проследите, что создается, и что удаляется. Класс такого плана:

class Test
{
public:
Test (int i) {
m_num = i;
print ("Created");
}
~Test ()
{
print ("Removed");
}

pribate:
void print (const char * s) { printf ("s: %d ", m_num); }
int m_num;
}

В класс передаете индекс в массиве, под которым вы его вводите. Мне кажется, дело в самом цикле, он где то сбоит.
А насчет потоков можно только одно предположить - то, что система не позворляет вам оперировать таким количество потоков, либо потоки просто не успевают отработать, ибо цикл съедает все процессорное время программы. Опять таки, какого рода утечки, вы не написали. Чего у вас утекает-то? :)
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 11.08.2007, 02:50

Отвечает: Ross
Здравствуйте, Tundravarg!

Единственная причина, по которой память может не освобождаться - если в коде
t = pthread_join(ths[i], NULL);
if (t != 0) {
fprintf(stderr, "Error: pthread_join: %d ", t);
continue;
}
функция pthread_join начнет всегда возвращать ненулевое значение для определенных потоков.
В тестовом примере (в приложении) память выделяется и освобождается нормально.

Приложение:

---------
Доступно только то, что видимо (c) Б. Керниган

Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 13.08.2007, 15:58


Вопрос № 97.980
Здравствуйте эксперты. Подскажите пожалста ответ на вопрос:
у меня есть форма приложения и фоном этой формы я хочу задать не просто заливку, а изображение. Я использую компоненту Timage, но картинка закрывает собой подписи полей, ни в свойствах компоненты Timage, ни в свойствах формы не могу ничего найти, чтобы исправить это!!!
Отправлен: 10.08.2007, 19:50
Вопрос задал: Rik (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: estiGi
Здравствуйте, Rik!
Возвращайте кисть на свой рисунок из обработчика WM_CTLCOLORDLG, тогда рисунок будет фоновым для остальных контролов
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 10.08.2007, 20:57


Вопрос № 97.984
Здравствуйте, уважаемые Эксперты!
Проблема такая: Есть цикл While и он бесконечен, но надо чтобы 1 такт это цикла выполнялся один раз где-то в 5 секунд(не меньше 5 и не больше 10 секунд). Т.е. Цикл выполнился 1 раз подождал секунд 5 и опять выполнился и т.д. Короче нужна задержка в 5 секунд.
С уважением, Нурлан.
Отправлен: 10.08.2007, 20:26
Вопрос задал: Nyrlan Ilubaev (статус: 1-ый класс)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: V1s0r
Здравствуйте, Nyrlan Ilubaev!

Если пишите на Win32 API, то можно воспользоваться
VOID Sleep(DWORD dwMilliseconds);
из
#include <windows.h>

В Linux попробуйте
struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
nanosleep(&ts, NULL);
Ответ отправил: V1s0r (статус: 3-ий класс)
Ответ отправлен: 10.08.2007, 20:42
Оценка за ответ: 5

Отвечает: Кузнецов Дмитрий Григорьевич
Здравствуйте, Nyrlan Ilubaev!
Можно использовать таймер и обычный цикл while (не бесконечный).
Ответ отправил: Кузнецов Дмитрий Григорьевич (статус: 1-ый класс)
Ответ отправлен: 10.08.2007, 20:44
Оценка за ответ: 5

Отвечает: estiGi
Здравствуйте, Nyrlan Ilubaev!
используйте обычный sleep, для удобства - в инструкции for

for ( ; ; sleep (5))
{
...
}
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 10.08.2007, 20:53
Оценка за ответ: 5

Отвечает: Зотов Дмитрий Владимирович
Здравствуйте, Nyrlan Ilubaev!
Используйте функцию Sleep(5);.
Ответ отправил: Зотов Дмитрий Владимирович (статус: 2-ой класс)
Ответ отправлен: 11.08.2007, 01:39
Оценка за ответ: 5

Отвечает: Aristos
Здравствуйте, Nyrlan Ilubaev!

Есть WinAPI функция Sleep(). Приостанавливает время выполнения программы на указанное количество милисекунд.
Ответ отправил: Aristos (статус: 2-ой класс)
Ответ отправлен: 11.08.2007, 02:32
Оценка за ответ: 5

Отвечает: Попов А.С.
Здравствуйте, Nyrlan Ilubaev!
Используйте фунцию из windows.h
WINBASEAPI void WINAPI Sleep(DWORD mS) - задержка в миллисекундах
Ответ отправил: Попов А.С. (статус: 2-ой класс)
Ответ отправлен: 11.08.2007, 06:37
Оценка за ответ: 5

Отвечает: Sema
Здравствуйте, Nyrlan Ilubaev!
Смотри фукнцию sleep
задержка устанавливается в микросекундах.
Ответ отправил: Sema (статус: 3-ий класс)
Ответ отправлен: 13.08.2007, 16:18


Вопрос № 98.017
Здравствуйте.
Помогите, пожалуйста, написать программу на C++. Программа должна производить ряд вычислений и выводить на экран время своего выполнения. Спасибо.

Приложение:

Отправлен: 11.08.2007, 07:07
Вопрос задал: Manofmoods (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Sov
Здравствуйте, Manofmoods!
#include <stdio.h>
#include <time.h>
int main()
{
clock_t start, end;
start = clock();
// t = текущее время
int j, i, p;
j=2;
p=3;
for(i = 1; i <= 500000; i++) {
int q = j*p;
q = q/p;
}
// вывод «разница текущего времени с t»
end = clock();
printf("разница текущего времени с t: %f ",(end - start) / CLK_TCK);
return 0;
}
Ответ отправил: Sov (статус: 6-ой класс)
Ответ отправлен: 11.08.2007, 07:36


Вопрос № 98.025
Здравствуйте уважаемые!
Занялся изучением С. Дошел до структур и файлов и натыкаюсь на камни. Вопрос в слудующем:
Программа должна считать структуру из файла. Пользуюсь для этого функцией fread(&struct, sizeof(struct), 1, *filepointer) (Из книги А.Нейбауэра).
Содержимое фала TEST таково:
name......24174. Объявление структуры и код программы в приложении. В тексте программы есть закомментированные строки, используя которые содержимое файла обрабатывается корректно, то есть так:
name......
24
174
Цель же моя - использовать именно функцию fread, которая почему-то выводит:
name......24174
24174
74
Подскажите мою ошибку, второй день сижу :(

Приложение:

Отправлен: 11.08.2007, 10:03
Вопрос задал: Nikankin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Хватов Сергей
Здравствуйте, Nikankin!

У вас всё просто - строки не завершаются нулевыим байтами.
Поэтому первый puts выводит все три поля.
Да и последний puts выводит правильно только потому что после per в памяти случайно оказался нулевой байт.

Вообще вы тут избежали ещё сюрпризов - поля структур могут выравниваться по границам слов, и между ними могут быть промежутки. В вашем случае все поля char[] и такого нет, но полный размер структуры должен быть 16 байт.
Ответ отправил: Хватов Сергей (статус: Студент)
Ответ отправлен: 11.08.2007, 10:59
Оценка за ответ: 5

Отвечает: kool
Здравствуйте, Nikankin!
Скорее всего это из за выравнивагия полей структуры
Лучше всего использовать прагму
#pragma pack(1). См. приложение.
Удачи!

Приложение:

---------
I am.

Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 11.08.2007, 14:24
Оценка за ответ: 5


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.54 beta от 01.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное