4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
1

Задержка при передаче сообщения (перед новым действием)

03.10.2010, 17:31. Показов 2149. Ответов 13

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Проблема в следующем. По кнопке я запускаю открытие нового приложения, и этим же действием хочу выгрузить сообщение в это приложение. Но сообщение не выгружается, т.к. форма открывается "значительно" время. Если передачу сообщения делать отдельной кнопкой все работает, т.ч. не в коде дело. Что можно придумать? есть ли какая-нибудь задержка, чтобы дать форме открыться или првоерка открыта ли форма или нет?
Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
                Process.Start("C:/Users/piloterist/Desktop/RCSoneproductiondeficit/RCSoneproductiondeficit/bin/Debug/RCSoneproductiondeficit.exe");
 
 try
            {
                Process[] procs = Process.GetProcessesByName("RCSoneproductiondeficit");
                foreach (Process proc in procs)
                    if (proc.Id != Process.GetCurrentProcess().Id)
                    {
                        string cmd = messageKatPlan;
 
                        IntPtr hParam = Marshal.StringToHGlobalAnsi(cmd);
 
                        API.ApiClass.COPYDATASTRUCT cds = new API.ApiClass.COPYDATASTRUCT();
                        cds.dwData = IntPtr.Zero;
                        cds.cbData = cmd.Length * sizeof(char) + 1;
                        cds.lpData = hParam;
 
                        IntPtr hStruct = Marshal.AllocHGlobal(Marshal.SizeOf(cds));
                        Marshal.StructureToPtr(cds, hStruct, true);
                        API.ApiClass.SendMessage(proc.MainWindowHandle,
                                API.ApiClass.WM_COPYDATA, IntPtr.Zero, hStruct);
 
                        Marshal.FreeHGlobal(hStruct);
                        Marshal.FreeHGlobal(hParam);
                        break;
                    }
            }
            catch { }
            }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2010, 17:31
Ответы с готовыми решениями:

Задержка перед действием
Хочу сделать задержку перед телепортацией, но не понимаю как. private void...

QDataStream: при передаче данных иногда появляется задержка в 16 мс
Вообщем столкнулся с такой проблемой. void myUDPclient::_sl_read() { while...

Границы сообщения при передаче через TCP
Есть клиент/сервер, общаются через TCP. Логика следующая: клиент отправляет сообщение, сервер...

Сетевой чат: при передаче сообщения сервер зацикливается
Здравствуйте,господа. возникла проблема в написании чата. при передачи сообщения сервер...

13
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.10.2010, 18:16 2
Вместо SendMessage использовать SendMessageTimeout. Либо проверять валидность proc.MainWindowHandle.

Ещё можно посмотреть тут и тут.
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
03.10.2010, 18:41  [ТС] 3
Мне надо делать задержку не запуску Process а последующей за ним команде.
Что надо изменить чтобы использовать SendMessageTimeout?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.10.2010, 20:34 4
Цитата Сообщение от piloterist Посмотреть сообщение
Мне надо делать задержку не запуску Process а последующей за ним команде.
Я это понял, и привёл Вам 2 ссылки.

Попробовал с SendMessageTimeout, эффекта это не предало, посмотрел код, как я и сказал окно просто не успевает создаться, из-за этого MainWindowHandle = null. Измените код следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Process.Start("C:/Users/piloterist/Desktop/RCSoneproductiondeficit/RCSoneproductiondeficit/bin/Debug/RCSoneproductiondeficit.exe");
 
try {
    Process[] procs = Process.GetProcessesByName("RCSoneproductiondeficit");
    foreach (Process proc in procs)
        if (proc.Id != Process.GetCurrentProcess().Id) {
            IntPtr hWnd = IntPtr.Zero;
            while ((hWnd = Process.GetProcessById(proc.Id).MainWindowHandle) == IntPtr.Zero) { }
 
            string cmd = messageKatPlan;
 
            IntPtr hParam = Marshal.StringToHGlobalAnsi(cmd);
 
            API.ApiClass.COPYDATASTRUCT cds = new API.ApiClass.COPYDATASTRUCT();
            cds.dwData = IntPtr.Zero;
            cds.cbData = cmd.Length * sizeof(char) + 1;
            cds.lpData = hParam;
 
            IntPtr hStruct = Marshal.AllocHGlobal(Marshal.SizeOf(cds));
            Marshal.StructureToPtr(cds, hStruct, true);
            API.ApiClass.SendMessage(hWnd,
                    API.ApiClass.WM_COPYDATA, IntPtr.Zero, hStruct);
 
            Marshal.FreeHGlobal(hStruct);
            Marshal.FreeHGlobal(hParam);
            break;
        }
}
catch { }
Кстати, а почему у Вас слеши (/) в пути, в обратную сторону?
1
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
03.10.2010, 20:57  [ТС] 5
Спасибо, заработало, правда дольше открываться стало ну да ладно.
Сам удивился но если ставить слэши правильно то ошибки лезут =)
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.10.2010, 21:00 6
Process.Start("C:/Users/piloterist/Desktop/RCSoneproductiondeficit/RCSoneproductiondeficit/bin/Debug/RCSoneproductiondeficit.exe");
Делай либо так:
C#
1
Process.Start(@"C:\Users\piloterist\Desktop\RCSoneproductiondeficit\RCSoneproductiondeficit\bin\Debug\RCSoneproductiondeficit.exe");
либо так:
C#
1
Process.Start("C:\\Users\\piloterist\\Desktop\\RCSoneproductiondeficit\\RCSoneproductiondeficit\\bin\\Debug\\RCSoneproductiondeficit.exe");
1
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
03.10.2010, 21:47  [ТС] 7
Не знал, спасибо=)
0
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
03.10.2010, 23:19 8
А лучше пользоваться системными перечислениями
пример:
C#
1
Environment.GetFolderPath(Environment.SpecialFolder.Desctop)
http://msdn.microsoft.com/ru-r... older.aspx
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
10.10.2010, 20:00  [ТС] 9
Снова тот же вопрос. Только времени не хватает перед закрытием приложения. На одну кнопку поставил обновление базы данных и закрытие приложения. Собственно проблема в том что приложение закрывается а база не обновляется. Как сделать паузу между этими двумя действиями? Может таймер можно использовать как-то?
0
2096 / 1261 / 171
Регистрация: 01.02.2009
Сообщений: 2,842
11.10.2010, 01:42 10
Покажите код кнопки закрытия.
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
11.10.2010, 07:24  [ТС] 11
C#
1
this.Close();
0
2096 / 1261 / 171
Регистрация: 01.02.2009
Сообщений: 2,842
11.10.2010, 09:08 12
Цитата Сообщение от piloterist Посмотреть сообщение
На одну кнопку поставил обновление базы данных и закрытие приложения.

Не по теме:

:) А где код обновления базы?

0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
11.10.2010, 19:52  [ТС] 13
Я подумал что вас интересует как я закрываю форму =)
C#
1
2
3
4
5
6
        private void button1_Click(object sender, EventArgs e)
        {
 
            plan_maxTableAdapter.Update(katalogPlanDataSet3.Plan_max);
           this.Close();
        }
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
15.10.2010, 20:11  [ТС] 14
Ну что есть какая-нить возможность задержать закрытие окна?
0
15.10.2010, 20:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2010, 20:11
Помогаю со студенческими работами здесь

QPlainTextEdit при передаче длинного сообщения приложение вылетает
Добрый день! Я новичок в программировании с Qt поэтому сильно не ругаейте! Столкнулся со следующей...

Защита при передаче сообщения по протоколу TCP и еще кое-что
Значит накопилось много вопросов на счет протокола TCP и передаче по нему данных : 1 - Если идет...

Задержка при включении: перед добро пожаловать сначала появляется чёрный экран.
Здравствуйте. Поставил себе не так давно windows 10, но вот такая проблема перед добро пожаловать...

Определить контрольный бит при передаче произвольного двоичного сообщения с использованием битов четности
Привет народ. Совершенно не шарю в Pascal. Есть такая задача. Составить математическую модель,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru