Pregunta

Dentro de mi aplicación, quiero enviar un mensaje de un hilo diferente a un diálogo. Quiero pasar una referencia de clase derivada std :: excepción al diálogo.

Algo como esto:

try {
       //do stuff
}
catch (MyException& the_exception) {
    PostMessage(MyhWnd, CWM_SOME_ERROR, 0, 0); //send the_exception or the_exception.error_string() here
}

Deseo recibir el mensaje en mi cuadro de diálogo y mostrar el error que está en the_exception.error_string()

LPARAM CMyDlg::SomeError(WPARAM, LPARAM)
{
    show_error( ?????
    return 0;
}

pasar el std::string the_exception.error_string() usando PostMessage también sería bueno, supongo.

¿Fue útil?

Solución

No se puede pasar la dirección de la cadena en PostMessage, ya que la cadena es probablemente local de subprocesos en la pila. En el momento en el otro hilo lo recoge, que podría haber sido destruido.

En su lugar, se debe crear una nueva cadena o excepción objeto a través de nuevo y pasar su dirección a la otra rosca (a través del parámetro WPARAM o LPARAM en PostMessage.) El otro hilo a continuación posee el objeto y es responsable de la destrucción de la misma.

Aquí hay un código de ejemplo que muestra cómo esto se podría hacer:

try
{
    //do stuff
}
catch (MyException& the_exception)
{
    PostMessage(MyhWnd, CWM_SOME_ERROR, 0, new string(the_exception.error_string));
}


LPARAM CMyDlg::SomeError(WPARAM, LPARAM lParam)
{
    // Put in shared_ptr so it is automatically destroyed.
    shared_ptr<string> msg = reinterpret_cast<string*>(lParam);

    // Do stuff with message

    return 0;
}

Otros consejos

Mientras estás dentro de un proceso, simplemente pasando un puntero nulo y * un cierto cuidado en duración de los objetos es suficiente.

Si es SendMessage puede pasar en LPARAM como un vacío * fundido, y el cliente uncast de nuevo a su tipo de cadena. Debido a SendMessage es sincrónica, que está a salvo:

  

Si la ventana especificada fue creado por   el subproceso de llamada, la ventana   procedimiento se llama inmediatamente como una   subrutina. Si la ventana especificada   fue creado por un hilo diferente, el   sistema cambia a ese hilo y   llama a la ventana apropiada   procedimiento. Los mensajes enviados entre   hilos sólo cuando el se procesan   hilo recibir realiza mensaje   código de recuperación. El proceso de envío es   bloqueado hasta que el hilo de recepción   procesa el mensaje

Si desea utilizar PostMessage entonces usted tendrá que hacer una parte explícita fuera porque la llamada es asíncrona: hacer una copia de la cadena en el montón y llamando a la PostMessage que haya pasado la responsabilidad de borrado al calee ( el cuadro de diálogo).

Si sales de proceso (MyhWnd pertenece a un proceso diferente), entonces es una historia completamente diferente y que tendrá que formar su mensaje en algo así como un átomo global.

Como siempre que se sepa que su ventana (o instancia de CMyDlg) seguirán siendo alrededor después de publicar el mensaje simplemente podría almacenar la cadena de error en una variable miembro y leer de esto en su controlador de mensajes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top