2 Eigenene Aber Externe Programme kommunizieren lassen!

    • VB.NET

    Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von BiedermannS.

      2 Eigenene Aber Externe Programme kommunizieren lassen!

      Ich habe eine sehr leicht Art gefunden Befehle von einem Programm(Beide Programme müssen selbstgemacht sein) zum Anderen zu senden!

      Ich habe das so Aufgebaut!

      Eine Programm speichert das was das andere Programm empfangen soll in einer TXT datei ab! Beide Programme kennen den Pfad der Txt datei!


      Nun speichert das Erste Programm den Txt über einen Timer Alle 100Ms ab! Das 2 Programm bracht nun nurnoch die Text auszulessen!

      Hier der Code vom 1.) Programm! >>>( Der Text was gesendet werden soll wird in die Textbox 1 geschrieben)


      VB.NET-Quellcode

      1. Public Class Form1
      2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      3. Timer1.Start()
      4. End Sub
      5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      6. Dim savef As New System.IO.StreamWriter("C:\Users\mcandy007\Desktop\Reden.txt")
      7. savef.Write(TextBox1.Text + ControlChars.NewLine)
      8. savef.Close()
      9. End Sub
      10. End Class



      Hier der Code vom 2.) Programm! >>>( Der Text was empfangen wird dir auch in einer Textbox angezeigt)

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      3. Timer1.Start()
      4. End Sub
      5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      6. Dim Lesen As String = IO.File.ReadAllText("C:\Users\mcandy007\Desktop\Reden.txt")
      7. TextBox1.Text = Lesen
      8. End Sub
      9. End Class





      > Ein Tipp noch das Programm 1 muss zuerst geöffnet werden da die Txt datei erst erstellt werden muss!

      --------------

      So ich hoffe ich konnte etwas helfen!

      Es ist nicht sehr schwer! und ich bitte keinen dummen Sprüche weil es nicht die eleganteste Weise ist! ;)

      Bei Fehler bitte mich korigieren! :P
      Da sind dann immer noch 3 Hacken:

      1. Du schafst es nicht, dass das zweite Programm genau zum richtigen Zeitpunkt gestart wird

      2. Irgendwann fallen alle Intervalle zusammen (außer du hast das gleiche Intervall, aber dann siehe 1.)

      3. Es dauert länger als 100 ms etwas abzuspeichern und die Datei wieder zu schließen (und dann laden und schließen soll in der Zeit doppelt geschehen!)


      Und wenn man nur einmal auslesen soll, wieso speicherst du es dann alle 100 ms (geht das überhaupt so oft) ab.

      Alteran
      Hi.
      Oder man macht es ordentlich und benutzt Windows Messages (WM):
      devsource.com/c/a/Using-VS/Wor…indows-Messages-in-NET/2/
      devsource.com/c/a/Using-VS/Wor…indows-Messages-in-NET/3/

      ~ Chris
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      dine intervalle können noch so unterschiedlich sein, noch so abgepasst...noch so gesteuert sein:
      i-wann kommt der punkt, andem beide programme zur selben zeit den zugriff wagen...warum?

      ein interval von 100 wird zwar als 100ms bezeichnet, jedoch sind es nicht genau 100ms...desweiteren spielen andere faktoren eine rolle, die den internen timer eines programmes stören. schleifendurchläufe, mal einen hänger, oder selbst wenn das lesen oder speichern mal etwas länger dauert, weil die platte grad aktiv von einem anderen programm genutzt wird, kann es sein, das der timer beim neuen anlauf länger als 100ms braucht....

      also diese methode ist..hm...nicht wirklich zu gebrauchen, nicht proffesionell..eher pfusch...
      Wie wäre es wenn du ein TextChange nimmst für das reinschreiben beim anderen bleibt woll nur der Timer...
      Dort könntest du einen Hash berechnen lassen und schauen ob dieser sich geändert hat (wenn in die Datei geschrieben wird!), wenn ja dann ließ es ein!
      Wäre jetzt mir spontan durch den Kopf gegangen...
      Kevin das bringt uns aber nicht wirklich weiter, wenn du viele guten Lösungen hast dann schreibe diese doch hier rein, damit können wir alle mehr anfangen als mit "bor ist das schlecht, ich kanns viel besser!"
      Wir wollen ihm ja dabei helfen Fortschritte zu machen!
      EDIT: Pipes gibt's erst am FW 3.5 !

      Mal als Ansatz (!!!):

      VB.NET-Quellcode

      1. Imports System.ComponentModel
      2. Imports System.IO.Pipes
      3. Public Class ClassPipeReceiver
      4. Public Event GotData(ByVal msg As String)
      5. Private WithEvents bw As New BackgroundWorker
      6. Private pname As String = String.Empty
      7. Public Sub New(ByVal pipename As String)
      8. pname = pipename
      9. bw.WorkerReportsProgress = True
      10. bw.WorkerReportsProgress = True
      11. End Sub
      12. Public Sub Run()
      13. If bw.IsBusy Then Exit Sub
      14. bw.RunWorkerAsync()
      15. End Sub
      16. Public Sub [Stop]()
      17. If bw.IsBusy Then bw.CancelAsync()
      18. End Sub
      19. Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
      20. Dim p As New IO.Pipes.NamedPipeServerStream(pname, PipeDirection.In, 100, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)
      21. Dim bgw As BackgroundWorker = CType(sender, BackgroundWorker)
      22. Dim b(4095) As Byte, i As Integer, s As String
      23. Do
      24. If Not p.IsConnected Then
      25. p.BeginWaitForConnection(New System.AsyncCallback(AddressOf connected), p)
      26. While Not p.IsConnected
      27. If bgw.CancellationPending Then Exit Do
      28. End While
      29. End If
      30. While i = 0
      31. If bgw.CancellationPending Then Exit Do
      32. i = p.Read(b, 0, 4096)
      33. System.Threading.Thread.Sleep(10)
      34. End While
      35. If i > 0 Then
      36. s = System.Text.Encoding.ASCII.GetString(b, 0, i)
      37. bgw.ReportProgress(1, s)
      38. End If
      39. i = 0
      40. p.Disconnect()
      41. Loop Until bgw.CancellationPending
      42. Try
      43. If p.IsConnected Then
      44. p.Disconnect()
      45. End If
      46. p.Dispose()
      47. Catch ex As Exception
      48. ' öm?
      49. End Try
      50. End Sub
      51. Private Sub connected(ByVal i As IAsyncResult)
      52. CType(i.AsyncState, IO.Pipes.NamedPipeServerStream).EndWaitForConnection(i)
      53. End Sub
      54. Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bw.ProgressChanged
      55. Dim s As String = CType(e.UserState, String)
      56. RaiseEvent GotData(s)
      57. End Sub
      58. End Class
      59. Public Class ClassPipeSender
      60. Public Event GotData(ByVal msg As String)
      61. Private WithEvents bw As New BackgroundWorker
      62. Private pname As String = String.Empty
      63. Public Sub New(ByVal pipename As String)
      64. pname = pipename
      65. bw.WorkerReportsProgress = True
      66. bw.WorkerReportsProgress = True
      67. End Sub
      68. Public Sub Run()
      69. If bw.IsBusy Then Exit Sub
      70. bw.RunWorkerAsync()
      71. End Sub
      72. Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
      73. Dim p As New IO.Pipes.NamedPipeClientStream(".", pname, PipeDirection.Out)
      74. Dim b As BackgroundWorker = CType(sender, BackgroundWorker)
      75. p.Connect(10)
      76. Dim w As New System.IO.StreamWriter(p)
      77. w.AutoFlush = True
      78. w.Write("Hello")
      79. w.Close()
      80. w.Dispose()
      81. p.Close()
      82. p.Dispose()
      83. End Sub
      84. End Class


      Nutzung zb:

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private WithEvents snd As New ClassPipeReceiver("mypipe")
      3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      4. Dim snd As New ClassPipeSender("mypipe")
      5. snd.Run()
      6. End Sub
      7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      8. snd.Run()
      9. End Sub
      10. Private Sub snd_GotData(ByVal msg As String) Handles snd.GotData
      11. Debug.Print("Got: " & msg)
      12. End Sub
      13. End Class


      Fehlt noch jede Menge Feintuning, aber besser als "Textdateien" ist es IMHO allemal und dem einen oder anderen mag es ja als Startpunkt dienen
      Kevin das bringt uns aber nicht wirklich weiter, wenn du viele guten
      Lösungen hast dann schreibe diese doch hier rein, damit können wir alle
      mehr anfangen als mit "bor ist das schlecht, ich kanns viel besser!"
      Es ist aber erstens schlecht und zweitens habe ich bereits zwei Lösungsvorschläge beigetragen -> Pipes/Socket (Auf die sich kevin89's Beitrag bezieht).