Вопрос № 78262: Здравствуйте!
Наверно все знают о возможности посылать сообщения в сети net send 192.168.x.x message!
Кто-нибудь может сказать как можно програмно отослать такие сообщения может быть есть api функции?
и как узнать дошло-ли сообщение?
..Вопрос № 78281: Здравствуйте Уважаемые эксперты!
Вот читаю хорошую книжку по C на досуге(и вашу рассылку) . Не подскажите компилятор полностью поддерживающий стандарт С99 , очень хочется опробывать все "фишки" =) .
Использую Microsoft Visual C++ Ex...Вопрос № 78282: Привет всем !
Как создать процесс без окна?...Вопрос № 78287: Всем привет. Такая проблемка. Нужно вычистить память из под двумерного массива. Работаю в С++ Builder 6. Что - то не выходит. Помогайте....Вопрос № 78290: мне нужно знать как в Си++:
1. Как конектиться к базе данных (при использовании SQL server 2005)
2. Как создавать потоки (threads, т.е. для распределенной обработки)
3. Какую библиотеку нужно подключить для работы с таймером, т.е. для выч...Вопрос № 78296: Здравствуйте. Вопрос по синтаксису. Я тут подзапутался, можно ли
работать с многомерными массивами с помощью указателей. Конкретно, мне нужно инициализировать int array[60][4].
Я сталкивался только с одномерными - там без проблем.
Если...Вопрос № 78348: Здравствуйте, уважаемые эксперты!!!
Не совсем уверен, что мой вопрос подходит по тематике, но всё же задам:
я решил написать в среде CBuilder собственный копировальщик файлов для проверки гипотезы о том, что windows копирует файлы медленно.<b...
Вопрос № 78.262
Здравствуйте!
Наверно все знают о возможности посылать сообщения в сети net send 192.168.x.x message!
Кто-нибудь может сказать как можно програмно отослать такие сообщения может быть есть api функции?
и как узнать дошло-ли сообщение?
один вариант я знаю: SystemExecute(0,"open","cmd.exe","-c net send 192.168.x.x message!",0,0)
какие ещё есть варианты?
Отправлен: 14.03.2007, 15:04
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Mihasic
Здравствуйте, Tatarin!
Есть WinAPI NetMessageBufferSend - находится в Netapi32.dll (соответственно Netapi32.lib). Объявлена в заголовке Lmmsg.h, но использовать надо Lm.h.
Работает только на WinNT/2K/XP (на висте не знаю).
Подробнее будет в справке.
Кстати, а зачем было SystemExecute(0,"open","cmd.exe","-c net send 192.168.x.x message!",0,0), когда можно без cmd.exe - консоль тут и так есть. И вообще можно было создать процесс без окна.
Ответ отправил: Mihasic (статус: 9-ый класс)
Ответ отправлен: 14.03.2007, 16:10 Оценка за ответ: 5
Вопрос № 78.281
Здравствуйте Уважаемые эксперты!
Вот читаю хорошую книжку по C на досуге(и вашу рассылку) . Не подскажите компилятор полностью поддерживающий стандарт С99 , очень хочется опробывать все "фишки" =) .
Использую Microsoft Visual C++ Express Edition (SP1, Windows Vista x64(лицензия, ето если что)).
Вот собственно вбиваю вот такой код (В шаблонах указал Console Application):
Просто много интересного читаю , а опробывать вживую как то не получается и соответственно плохо запоминается =)
Приложение:
Отправлен: 14.03.2007, 18:06
Вопрос задал: MeSaNei (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Thread
Здравствуйте, MeSaNei!
Если вы хотите писать именно на С99, то вы выбрали не тот компилятор. Могу посоветовать бесплатный компилятор MinGW32 ( Minimalist GNU for Windows) - он полностью поддерживает С99. Хочу заметить, что С++ не совместим полностью с С99.
Ответ отправил: Thread (статус: 5-ый класс)
Ответ отправлен: 14.03.2007, 18:18 Оценка за ответ: 5
Отвечает: V1s0r
Здравствуйте, MeSaNei!
Использую Gentoo Linux, компилятор - GCC. И то и другое Open Source, лицензия - GNU GPL (неужели есть какие-то ещё лицензии???).
Компилятор превосходный, поддерживает последний стандарт как C, так и C++.
Есть порты в Windows (MSYS MinGW Cygwin).
Ответ отправил: V1s0r (статус: 2-ой класс)
Ответ отправлен: 15.03.2007, 14:28
Вопрос № 78.282
Привет всем !
Как создать процесс без окна?
Отправлен: 14.03.2007, 18:08
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Ilkras
Здравствуйте, Tatarin!
Здравствуйте, Tatarin!
С помощью функции CreateProcess (Windows), fork(Unix/Linux)
Есть еще много других операционок (VxWorks, PSOS, Nucleus...), вам для всех нужно?
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 14.03.2007, 20:43 Оценка за ответ: 5
Отвечает: kool
Здравствуйте, Tatarin!
Создать программный модуль(проект "Приложение Win32"),
кот не имеет окна, а затем загрузить его с помощью
CreateProcess, например, или просто выполнить.
Удачи!
--------- I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 14.03.2007, 20:44 Оценка за ответ: 5
Вопрос № 78.287
Всем привет. Такая проблемка. Нужно вычистить память из под двумерного массива. Работаю в С++ Builder 6. Что - то не выходит. Помогайте.
Приложение:
Отправлен: 14.03.2007, 18:27
Вопрос задал: Dmeet (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: kool
Здравствуйте, Dmeet!
Все там выходит.
Память освобождается.
Но это н значит, что
она заполняется нулями.
Удачи!
--------- I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 14.03.2007, 20:44
Отвечает: Олег Владимирович
Здравствуйте, Dmeet!
Когда освобождается память из-под массива, надо писать delete [] ar[i] и delete [] ar.
Удачи!
Приложение:
--------- Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: Студент)
Ответ отправлен: 14.03.2007, 21:33
Отвечает: Терсков Сергей
Здравствуйте, Dmeet!
Верным является только второй вариант. Первый и третий если где-то и откомпилируются, то это не значит, что программа будет работать корректно. Если вы вызываете оператор new[], то и память нужно освобождать оператором delete[].
Ответ отправил: Терсков Сергей (статус: 6-ой класс)
Ответ отправлен: 15.03.2007, 03:10
Отвечает: John Paramol
Здравствуйте, Dmeet!
Если память выделялась с помощью new (т.е. под один объект), то удаляться она должна delete, а если с помощью new[] (т.е. под массив объектов, пусть даже размерностью в 1 элемент), то удаляться она должна delete[]. Иначе будут утечки памяти или ошибка времени выполнения. В вашем случае вы сначала выделяете память под массив объектов (указателей), а потом под каждый указатель выделяете еще по массиву объектов. Соответственно, освобождать сначала надо память из-под каждого указателя с помощью delete[], а потом
из-под всего массива, тоже delete[]. Т.о. правильный второй вариант.
Кстати говоря, у вас это не совсем двумерный массив. Сходство лишь в синтаксисе обращения к эелементам. В настоящем двумерном массиве (который выделяется new[][], а освобождается delete[]) элементы физически располагаются друг за другом в одной непрерывной области памяти. А в вашем случае массивы чисел, на которые указывают каждый из указателей, могут физически находиться и на большом расстоянии друг от друга и отдельно от самого массива указателей, да и на массив указателей выделяется лишняя память, чего нет
в настоящем двумерном массиве. Однако этот настоящий двумерный массив не так часто используется по следующей причине: только первая размерность может быть переменной (например int (*mass)[3] = new int[count][3], count - переменная, 3 - константа), что часто не подходит для программиста.
В вашем случае можно сделать так:
int size=3;
double (*ar)[3] = new double[size][3];
//...
delete[]ar;
Успехов!
--------- 1=2, at values 1 large enough
Ответ отправил: John Paramol (статус: 6-ой класс)
Ответ отправлен: 15.03.2007, 22:39
Вопрос № 78.290
мне нужно знать как в Си++:
1. Как конектиться к базе данных (при использовании SQL server 2005)
2. Как создавать потоки (threads, т.е. для распределенной обработки)
3. Какую библиотеку нужно подключить для работы с таймером, т.е. для вычисления времени.
Отправлен: 14.03.2007, 18:39
Вопрос задал: Ventola
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Ilkras
Здравствуйте, Ventola!
threads создаются с помощью CreateThread (Windows)
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 14.03.2007, 20:46
Вопрос № 78.296
Здравствуйте. Вопрос по синтаксису. Я тут подзапутался, можно ли
работать с многомерными массивами с помощью указателей. Конкретно, мне нужно инициализировать int array[60][4].
Я сталкивался только с одномерными - там без проблем.
Если ответ - да, можно, то хотелось бы примерчик.
Спасибо.
Отправлен: 14.03.2007, 19:59
Вопрос задал: Lameruga (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: kool
Здравствуйте, Lameruga!
Инициировать можно так (см. приложение):
Удачи!
Приложение:
--------- I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 14.03.2007, 20:43 Оценка за ответ: 5 Комментарий оценки: Спасибо. То что надо.
Отвечает: Ilkras
Здравствуйте, Lameruga!
Разницы между одномерными и многомерными массивами никакой нет. Можете считать ваш массив одномерным (int array[240]) или, например, четырехмерным (int array[30][2][2][2]). Кроме того массив - это просто выделенная область памяти - можете инициализировать ее с помощью memset. Например так: memset(array, 0, 240*sizeof(int));
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 14.03.2007, 20:53 Оценка за ответ: 4 Комментарий оценки: см минифорум.
Отвечает: Sergey A. Wedensky
Здравствуйте, Lameruga!
Инициализацией обычно называют задание значения переменной (значений элементов массива) при определении этой переменной, вроде int a = 2;
Не уверен, что Вам захочется вбивать 240 значений, но в принципе инициализировать можно, например int ar[4][2] = {{1,2},{3,4},{5,6},{7,8}};
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 15.03.2007, 10:14 Оценка за ответ: 5 Комментарий оценки: Спасибо.
Вопрос № 78.348
Здравствуйте, уважаемые эксперты!!!
Не совсем уверен, что мой вопрос подходит по тематике, но всё же задам:
я решил написать в среде CBuilder собственный копировальщик файлов для проверки гипотезы о том, что windows копирует файлы медленно.
Пишу, естественно, под windows и на API. Код очень большой, но суть проста: при нажатии на кнопку я создаю новый поток, который изредка посылает сообщения окну о прогрессе. Для полноты приведу код поточной процедуры и структуры STRUCT_START_THREAD в отдельном окне. Ну, конечно, для возможности настроить копировальщик на макс. скорость я добавил такие опции, как:
- копирование файла полностью (выделяю буфер в памяти размером с файл)
- задание размера буфера
- изменение класса приоритета процесса
- изменение приоритета (относительного) потока (у первичного потока приоритет не меняется и равен THREAD_PRIORITY_NORMAL)
- тихий режим (bQuiet = true), когда во время операции копирования никакие сообщения окну вообще не посылаются.
Вот. Всё работает:-)
Собственно вопрос:
Когда я стал играться с программой, я обнаружил, что при одинаковых настройках время копирования может разниться на 50%!! (в диспетчере задач никаких изменений не происходило)
Когда я ставил критический приоритет THREAD_PRIORITY_TIME_CRITICAL и REALTIME_PRIORITY_CLASS (в документации написано, что это выставляет базовый приоритет в 31) время копирования абсолютно не менялось, а загрузка прцессора доходила макс. до 30% и опять-таки разброс результатов был катастрофическим!!!
Почему?
Я проверял: в диспетчере задач мой процесс был процессом "реального времени", но "бездействие системы" жрало 70-80% процессорного времени и ничего не глючило!
Опять-таки почему?
И скажите пожалуйста, как можно увеличить скорость копирования еще?
Спасибо всем тем, кто откликнется.
Приложение:
Отправлен: 15.03.2007, 02:08
Вопрос задал: Evkwarrior (статус: 1-ый класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Sergey A. Wedensky
Здравствуйте, Evkwarrior!
Боюсь все Ваши ухищрения с приоритетами реального времени бесполезны. Полагаю скорость копирования файла должна слабо зависеть от процессорного времени, на это затрачиваемого. Посудите сами: нужно физически считать данные с носителя, передать их по шине в оперативную память, оттуда обратно в контроллер диска и опять же физически записать на диск. Эти операции большей частью производит не процессор, от него вообще мало что требуется. Это если нет кэширования. На самом деле в системе существует файловый кэш, который
несколько (а иногда и сильно) меняет описанную схему. Из-за его наличия, в первую очередь, и может меняться реальное время, необходимое для копирования файла. Например, если Вы только что скопировали файл и потом хотите его же скопировать в еще один, реальное чтение с диска может вообще не произойти - содержимое файла уже есть в ОП (дисковом кэше системы), хотя бы чистично.
В общем, вывод: такими методами (использование File API) Вы точно ничего не добьетесь и приоритеты процесса тут ни причем совершенно. Если очень хотите добиться ускорения копирования, можно было бы попробовать низкоуровневую работу с носителем - чтение/запись напрямую в сектора, минуя системный кэш и пр. - это, возможно что-то и даст.
Удачи.
P.S. Было бы интересно узнать о результатах.
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 15.03.2007, 10:37 Оценка за ответ: 5 Комментарий оценки: DMA и кэш? Да, вы правы, копирование происходит без загрузки процессора, наверное. Но что интересно, повторное копирование одного файла приводит не к увеличению скорости, а, наоборот, к уменьшению!!! (так, по крайней мере, происходит у меня)
Отвечает: V1s0r
Здравствуйте, Evkwarrior!
"Пишу, естественно, под windows и на API."
Это, типа, круто? LPVOID, HINSTANCE, HRESULT, WPARAM, MB_ICONINFORMATION, LPARAM, 0xFFFFFFFF м-да...
Я вот, например, под Windows пишу редко.
Преимущественно под Linux.
А ещё лучше - многоплатформенная разработка программного обеспечения (много есть библиотек, но лучшая - Qt).
Ответ отправил: V1s0r (статус: 2-ой класс)
Ответ отправлен: 15.03.2007, 14:20 Оценка за ответ: 2 Комментарий оценки: А где, собственно, ответ???
Отвечает: kool
Здравствуйте, Evkwarrior!
>>И скажите пожалуйста, как можно увеличить скорость копирования еще?
А еще можно использовать отображение файлов на память.
И это должно быть значительно быстрее.
Удачи!
--------- I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 15.03.2007, 20:49 Оценка за ответ: 5 Комментарий оценки: Интересно, попробую!