Здравствуйте, коллеги. Это не вопрос, а так, хочется узнать, кому какой способ предотвращения запуска второго экземпляра приложения больше нравится: поиск окна, с помощью Mutex'а или с помощью разделяемой секции? По мне, лучше всего третий вариант. Вот я и не могу понять, ПОЧЕМУ большинству нравится второй? Почти везде он описан. Третий ведь намного проще. Пишешь: #pragma data_seg("Shared") bool Started=FALSE; #pragma data_seg() #pragma comment(linker, "/Section:Shared,rws") Потом в начало WinMain вставляешь: if (Started) { MessageBox(NULL,"Program is Already Running!","Error",MB_ICONERROR); return 0; } А чуть дальше вставляешь Started=TRUE; И все. Помойму, лучше способа нет. И объекты ядра зря не создаются, и окно проги можно переименовывать, и все ясно и понятно. Правда,
непонятно, можно ли в Борландовских продуктах этот способ использовать, но зато в VC и MASM32 точно можно. А вам какой способ больше нравится?
Добрый день, Marouder! А мне лично пофиг. Обычно я нее праю мозги и ищу определенный процесс. Ответ отправлен: 30.09.2003, 15:22 Отправитель: Извращенок Отвечает Bobs
Доброе время суток, Marouder! Есть ещё способ с созданием в корне диска файла с аттрибутами system+hidden+FILE_FLAG_DELETE_ON_CLOSE. Это работает точно везде и всюду (писалось и на бейсике, и на двух вариантов C++) и имеет преимущества перед, например, 2ым вариантом (если программа вылетит, mutex никуда не денется до перезагрузки системы, а файл просто удалится.) Ответ отправлен: 30.09.2003, 15:17 Отправитель: Bobs Отвечает Gibbel
Приветствую Вас, Marouder! Приведенный вами метод не дает 100% гарантии, что второй экземпляр не будет запущен. Ведь между проверкой флага Started и его установкой пройдет несколько тактов, в которые Windows может передать управление другой копии программы, которая, в свою очередь, также проверит флаг Started, и убедиться, что она единственная в своем роде. Если все-таки вам не терпиться применить данный метод, то я прибегнул бы к использованию языка Assembler. Тогда проверка выглядела бы так: mov eax,1 xchg dword ptr [Started],eax cmp eax,1 А все таки, с Mutex'ами надежнее - есть 100% гарантия, что будет работать и на многопроцессорной системе. Ответ отправлен: 30.09.2003, 14:14 Отправитель: Gibbel Отвечает Yuri Gordienko
Здравствуйте, Marouder! Для случая проверки наличия программы разделяемые секции проще и удобнее, но ведь Mutex'ы скорее предназначены для многопоточного программирования, где такая тема не катит. Успехов
Ответ отправлен: 30.09.2003, 12:54 Отправитель: Yuri Gordienko Отвечает Eugene
Здравствуйте, Marouder! На борландовских продуктах 3-й способ мне не удалось осуществить. А 1-й и 2-й мне не нравятся. Гораздо удобнее на мой взгляд создание временного файла. А вся процедура не намного сложнее 3-го способа. В начале надо только создать файл и всё: char *lpTempName = new char[256]; GetTempPath(256, lpTempName); StrCat(lpTempName, "prog_start.tmp"); HWND hFile = CreateFile(lpTempName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_DELETE_ON_CLOSE, NULL); delete[]lpTempName; if(hFile == INVALID_HANDLE_VALUE) { MessageBox(NULL,"Program is Already Running!","Error",MB_ICONERROR); return 1; } Этот файл в программе даже закрывать не надо. Ответ отправлен: 30.09.2003, 17:03 Отправитель: Eugene Отвечает BOLT
Приветствую Вас, Marouder! Неплохо! А спорить какой способ лучше: использовать mutex или твой я не берусь спорить, т.к. какой способ быстрее по времени выполнения, я не знаю.
Да прибудет с тобой Великая Сила! This message was created by EMan 1.5
Ответ отправлен: 30.09.2003, 17:19 Отправитель: BOLT
Вопрос № 1094
Здравсвуйте. Почему следующая конструкция компилируется, но работает некорректно: if (1Наверное, компилятор сначала сравнивает х с 1, после этого присваивает выражению значение 1 или 0, а потом сравнивает полученное значение с 8? Я прав? И будет ли правильно: if ( (1Заранее спасибо.
Здравствуйте, Yad! Тебя глючит что-ли? Че это такое: "if(1"? И причем здесь 8? Ответ отправлен: 01.10.2003, 11:42 Отправитель: Marouder Отвечает Yuri Gordienko
Приветствую Вас, Yad! Примеры пиши или используя html или пиши в окне Приложение, т.к. все твои примеры порубаны Успехов Ответ отправлен: 30.09.2003, 15:25 Отправитель: Yuri Gordienko Отвечает Vdr
Доброе время суток, Yad! Наверное прав... но где конструкция? Удачи! Ответ отправлен: 01.10.2003, 10:45 Отправитель: Vdr Отвечает Avl2k
Приветствую Вас, Yad! Условие съедено парсером, как и в вопросе #1092. Выхода два: повторить его, поместив условие в приложение (ну или заэкранировать), либо дождавшись, пока RusFaq перестанет воспринимать знаки < как начало тега :) С уважением, Avl2k. Ответ отправлен: 30.09.2003, 15:47 Отправитель: Avl2k Отвечает BOLT
Приветствую Вас, Yad! Я непонимаю! Ты можешь нормально написать! > if (1 Что это такое? > if ( (1 А это?
Да прибудет с тобой Великая Сила! This message was created by EMan 1.5
Ответ отправлен: 30.09.2003, 17:19 Отправитель: BOLT Отвечает Dzik
Здравствуйте, Yad! Ну раз еще никто толком не ответил, отвечу я. Конечно же правильно писать как во втором случае, т.е. разбив на два условия, почему компилятор пропускает 1<x<8 я не знаю, но по идее он должен выдавать ошибку. Ответ отправлен: 30.09.2003, 19:02 Отправитель: Dzik
Вопрос № 1095
Добрый вечер. Как можно узнать точное время работы программы. (чтобы потом можно было сравнить несколько программ по времени их работы) Спасибо.
Здравствуйте, Yad! Хе. Для этого нужно писать отдельную прогу, которая фиксировала бы это самое время. А по-правде, точное время можно вычислить математически, только это очень-очень сложно. Ответ отправлен: 01.10.2003, 10:58 Отправитель: Извращенок Отвечает BOLT
Здравствуйте, Yad! В начале программы запрашиваешь системное время. В конце тоже. Потом отнимаешь конечное от начального. Вот и все.
Да прибудет с тобой Великая Сила! This message was created by EMan 1.5
Ответ отправлен: 30.09.2003, 20:10 Отправитель: BOLT Отвечает Bobs
Приветствую Вас, Andrey! Пиши в строке не один слэш а два, т.к. компилятор преобразует его иследующий за ним символ в специальный.
#include #include #include #include void main() { ifstream infile("c:\\2.txt"); ofstream outfile("c:\\1.txt"); if (! infile) cout << "No open c:2.txt";
if (! outfile) cout << "No open c:1.txt"; char word; while ( infile >> word ) outfile << word; getch(); }
Да прибудет с тобой Великая Сила! This message was created by EMan 1.5
Ответ отправлен: 30.09.2003, 20:27 Отправитель: BOLT
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.