Member 14087451 Ответов: 2

Отправить обратный вызов в разных потоках в C


я хочу отправить свои обратные вызовы в разных потоках, возможно ли это ?

Что я уже пробовал:

иам постоянно посылает вызовы на другие приложения
typedef struct
	{
		char *Domain;
		char *Uri;
		UINT32 IpAddr;
		UINT32 Port;
		int  Direction;	//0:-InBound,1:-Outbound
	}PACKETINFO, *PPACKETINFO;

	typedef int(CALLBACK *ProgressCallback)(PACKETINFO *info);	


Dowork(ProgressCallback funcaddr)
{
while(true)
{
         	if(funcaddr !=0 )
		{	
                	//callback send here		
			res = funcaddr(pinfo);			
		}
}
}

Rick York

Что означает "отправить мои обратные вызовы"?

Код, который вы разместили, передает указатель на функцию в функцию. Это вполне возможно.

2 Ответов

Рейтинг:
0

KarstenK

Это не очень хорошая идея, потому что вам нужно передать память и управление другому потоку, который может приостановиться или выйти через некоторое время.

Поэтому я бы запланировал данные с некоторой функцией передачи (в потоке 1) в некоторое хранилище, которое добавляет данные (в память потока 2). Чем поток 2 может извлекать данные и работать над ними.

Обработайте сценарий, когда поток 2 завершается, и поэтому установите указатель функции в потоке 1 в значение NULL.


Member 14087451

пример кода плз

Рейтинг:
0

CPallini

Да, вы можете это сделать, конечно.

Я бы написал следующее: Dowork функция таким образом

Dowork(ProgressCallback funcaddr)
{
  if ( funcaddr != 0)
  {
    while(true)
    {	
      res = funcaddr(pinfo);
    }
  }
}
В любом случае:
  • Где res определились?
  • А также, Где находится pinfo определились?
  • Почему вы повторяете бесконечный цикл, просто отбрасывая возвращаемое значение обратного вызова?


Member 14087451

на самом деле это код DLL пользовательского режима, который получает информацию от драйвера, который он отправляет в пользовательский интерфейс и получает оттуда resonse, res - это ответ
pinfo-это PACKETINFO, который он отправляет в пользовательский интерфейс

Member 14087451

iam повторяется в бесконечном цикле потому что эта библиотека dll пользовательского режима читает пакеты отправленные приложением драйвера и анализирует пакет отбрасывая пакеты и повторно вводя их в соответствии с ответом полученным от приложения пользовательского интерфейса

Member 14087451

в настоящее время я сталкиваюсь с проблемой, что dll пользовательского режима непрерывно отправляет информацию в приложение пользовательского интерфейса, которое делает сбой приложения пользовательского интерфейса, я хочу, чтобы если мы отправим ответ в другом потоке приложение пользовательского интерфейса получит больше времени для ответа на dll пользовательского режима

Member 14087451

полный код похож на

структура typedef
{
char *домен;
char *Uri;
Тип uint32 при;
Порт тип uint32 ;
int Direction; //0:-входящий,1:-исходящий
}PACKETINFO, *PPACKETINFO;

typedef int(CALLBACK *ProgressCallback)(PACKETINFO *info);

PPACKETINFO pinfo = { 0 };
const int ALLOW = 1;
const int BLOCK = 0;
Метода dowork(ProgressCallback funcaddr)
{



в то время как(правда)
{


если (!PacketsRecv(ручка, пакет, размер(пакета), &ампер;packet_len, &ампер;Эл))
{
fprintf(stderr, "предупреждение: не удалось прочитать пакет (%d)\n",
И getlasterror());
продолжить;
}
//printf("прием пакета....\n");
ParsePacket(packet, packet_len, &ip_header, NULL,
Нуль, нуль, нуль, &ампер;tcp_header, значение null, &ампер;груза, &ампер;payload_len,
НУЛЬ, НУЛЬ);

если (ip_header == нуль || tcp_header == нуль || грузоподъемность == нуль)
{
// Packet не соответствует черному списку; просто повторно вставьте его.
if (!PacketSend(handle, packet, packet_len, NULL, &addr))
{
fprintf(stderr, "warning: failed to reinject packet (%d)\n",
И getlasterror());
}
продолжить;
}

int response = 0;

если(funcaddr !=0 )
{
//обратный вызов отправить сюда
ответ = funcaddr(pinfo);

}

бесплатно(pinfo);
pinfo = NULL;

если (ответ == разрешить )
{
// Packet не соответствует черному списку; просто повторно вставьте его.
if (!PacketSend(handle, packet, packet_len, NULL, &addr))
{
fprintf(stderr, "warning: failed to reinject packet (%d)\n",
И getlasterror());
}
продолжить;
}

иначе мы заблокируем его, угнав машину.
// соединение.
}


}

Member 14087451

как я могу отправить ответ в нескольких потоках, чтобы сделать свое приложение более отзывчивым