|
|
Возраст: 37 C нами с 25.01.2005 Репутация: 133
|
|
Неоспоримым достоинством языка С++ является то, что он является языком одновременно и высокого и низкого уровней, что делает его незаменимым при разработке игр и других сложных и требовательных к производительности приложений.
P.S. Перед задаванием вопросов вроде "Что делает эта функция" настоятельно рекомендуется поизучать MSDN.
P.P.S. В ближайшее время выложу много литературы по этому вопросу.
|
|
|
|
|
|
|
|
Возраст: 34 C нами с 21.03.2005 Репутация: 130
|
|
|
|
|
|
|
|
Возраст: 39 C нами с 10.08.2005 Репутация: 6.9
|
|
Абсент, почитайте исходники апишной функции FindWindow . Она использует рекурсивный самовызов. Это именно то, что вам нужно.
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 04.02.2005 Репутация: 121.3
|
|
Абсент, какая задача-то? Найти папку с заданным именем? Хотя бы одну или все?
|
|
|
|
|
|
|
|
Возраст: 34 C нами с 21.03.2005 Репутация: 130
|
|
chaser, все папки с таким именем
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 04.02.2005 Репутация: 121.3
|
|
Ну типа вот. Правда, я не компилил ни разу, так как под рукой нет компилятора под виндовс.
#include <algorithm>
#include <vector>
#include <string>
#include "windows.h"
#include "еще что-нибудь, если надо"
// Найти все папки с заданным именем
void
find_folders(const std::string& haystack, // откуда начинать поиск
const std::string& needle, // что ищем
std::vector<std::string>& result) // складываем найденное сюда
{
WIN32_FIND_DATA data;
HANDLE hf = FindFirstFile((haystack + "\\*").c_str(), &data);
// Если неудачно открыли директорию, ничего не делаем
if (hf == INVALID_HANDLE_VALUE)
return;
// Перебираем все файлы и папки в папке haystack
do {
// Если это папка...
if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// То сперва получим путь к ней.
std::string path = haystack + "\\" + data.cFileName;
// Во-первых, это может быть то, что мы ищем
if (needle == data.cFileName)
result.push_back(path);
// А во-вторых, в ней может лежать то, что мы ищем
find_folders(path, needle, result);
}
} while (FindNextFile(hf, &data));
// Закрываем каталог
FindClose(hf);
}
// Вывести содержимое каталога
void
list_folder(const std::string& path)
{
std::cout << "--- " << path << ": " << std::endl;
WIN32_FIND_DATA data;
HANDLE hf = FindFirstFile((path + "\\*").c_str(), &data);
if (hf == INVALID_HANDLE_VALUE)
return;
do {
std::cout << data.cFileName << std::endl;
} while (FindNextFile(hf, &data));
FindClose(hf);
}
// Решаем поставленную задачу
void
find_and_list(const std::string& haystack, // «корень» поиска
const std::string& needle) // имя искомых папок
{
std::vector<std::string> folders;
find_folders(haystack, needle, folders);
std::for_each(folders.begin(), folders.end(), list_folder);
}
|
|
|
|
|
|
|
|
|
Возраст: 34 C нами с 21.03.2005 Репутация: 130
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 04.02.2005 Репутация: 121.3
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 22.01.2006 Репутация: 256.8
|
|
Вопрос такой. Хочется использовать STL queue для передачи данных между потоками(несколько пишуших и несколько читающих). Достаточно ли запихать в мутексы push и pop?
P.S. альтернативные и более шустрые реализации приветствуются
как вариант может просто сделать статический массив и бегающие указатели, при pop в мутексе копировать элемент в область памяти, на которую передали указатель ну соответственно внутренние указатели ворочать... Только больно лень
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 04.02.2005 Репутация: 121.3
|
|
splav писал(а): |
Вопрос такой. Хочется использовать STL queue для передачи данных между потоками(несколько пишуших и несколько читающих). Достаточно ли запихать в мутексы push и pop?
|
Да, почему нет? Еще перед pop(), возможно, будет проверка на empty(), тоже «в мьютексе» (хотя, скорее всего, обойдется без нее, так как наверняка будет использоваться семафор для ожидания...). Главное, чтобы не передавались «коварные» данные типа boost::shared_ptr и проч.
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 22.01.2006 Репутация: 256.8
|
|
chaser, а можно ли использовать разные mutex для pop и push? Собственно главный вопрос.
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 04.02.2005 Репутация: 121.3
|
|
splav, то есть синхронизировать между собой отдельно читателей и отдельно писателей? Нельзя, конечно
|
|
|
|
|
|
|
|
Возраст: 44 C нами с 05.04.2005 Репутация: 121.1
|
|
splav, нужно читать описание той реализации STL, которую ты используешь... насколько я помню, стандарт не определяет - должна она быть thread safe или не должна. если твоя версия не thread safe то защищать нужно _все_ обращения к очереди. кроме push и pop ещё есть empty(); size(); front(); back(); в любой из них может возникнуть race condition
|
_____________________________ IRC WeNet #programming
jid: seb2000@jabber.ru
|
|
|
|
|
|
|
Возраст: 35 C нами с 22.01.2006 Репутация: 256.8
|
|
seb, chaser, короче делаю свою реализацию - хоть понятно чего ждать... Ибо покопавшись в том, что нашел получается, почти все вызовы надо запихивать в критические секции. Можно более независимо сделать в моём случае.
Всем спасибо.
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 04.02.2005 Репутация: 121.3
|
|
splav, а оно тебе действительно нужно? Напиши тогда для начала простую «обертку» для STL'ной очереди, а потом, если будет так важно, улучшишь реализацию. Measure before you optimise
Расскажи, кстати, идеи улучшения, интересно.
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 22.01.2006 Репутация: 256.8
|
|
chaser, не люблю общие вещи... Например, учитывая семафоры, явно можно одновременно добавлять и забирать данные. + использовать специфический аллокатор (для одного рамера). А в моём случае может более оправдана будет статическая реализация. Вопрос о сроках не стоит - делаю для себя. Так что можно разгуляться.
|
|
|
|
|
|
|
|