From b544c183856b8f7cbb5aea573a7a1136ae92a81a Mon Sep 17 00:00:00 2001 From: froehlich Date: Fri, 14 Feb 2020 10:45:41 +0000 Subject: [PATCH 1/3] started implementing a Generic application Bug 727 --- BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj | 3 +- BlueM.Opt/Apps/Generic.vb | 132 +++++++++++++++++ BlueM.Opt/Common/Constants.vb | 1 + BlueM.Opt/Main/Form1.vb | 212 ++++++++++++++------------- 4 files changed, 243 insertions(+), 105 deletions(-) create mode 100644 BlueM.Opt/Apps/Generic.vb diff --git a/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj b/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj index ebf6ea6b..ca990c64 100644 --- a/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj +++ b/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj @@ -3,7 +3,7 @@ Debug x86 - 9.0.21022 + 9.0.30729 2.0 {2DCFE99E-CBFE-4CCC-93E7-A6D628B16DEC} Library @@ -95,6 +95,7 @@ + True diff --git a/BlueM.Opt/Apps/Generic.vb b/BlueM.Opt/Apps/Generic.vb new file mode 100644 index 00000000..dccee593 --- /dev/null +++ b/BlueM.Opt/Apps/Generic.vb @@ -0,0 +1,132 @@ +' Copyright (c) BlueM Dev Group +' Website: http://bluemodel.org +' +' All rights reserved. +' +' Released under the BSD-2-Clause License: +' +' Redistribution and use in source and binary forms, with or without modification, +' are permitted provided that the following conditions are met: +' +' * Redistributions of source code must retain the above copyright notice, this list +' of conditions and the following disclaimer. +' * Redistributions in binary form must reproduce the above copyright notice, this list +' of conditions and the following disclaimer in the documentation and/or other materials +' provided with the distribution. +' +' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +' EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +' OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +' SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +' OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +' HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +' TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +' EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +'-------------------------------------------------------------------------------------------- +Public Class Generic + Inherits Sim + + ''' + ''' Eine StringCollection mit allen Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können + ''' + ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) + Public Overrides ReadOnly Property DatensatzDateiendungen() As Collections.Specialized.StringCollection + Get + Dim extensions As New Collections.Specialized.StringCollection() + extensions.Add("bat") + Return extensions + End Get + End Property + + ''' + ''' Multithreading support flag + ''' + ''' False + Public Overrides ReadOnly Property MultithreadingSupported() As Boolean + Get + 'TODO: enable multithreading + Return False + End Get + End Property + + ''' + ''' Die Sim-Anwendung für die Simulation vorbereiten + ''' + Public Overrides Sub prepareSimulation() + + 'TODO: Immer im Originalverzeichnis des Datensatzes simulieren? + Me.WorkDir_Current = Me.WorkDir_Original + + End Sub + + ''' + ''' Simulationsparameter einlesen + ''' + Protected Overrides Sub Read_SimParameter() + 'TODO + End Sub + + ''' + ''' TODO: this should not be MustOverride in the base class + ''' + Protected Overrides Sub Read_Verzweigungen() + 'pass + End Sub + + ''' + ''' TODO: this should not be MustOverride in the base class + ''' + Protected Overrides Sub Write_Verzweigungen() + 'pass + End Sub + + ''' + ''' Launch simulation + ''' + ''' launches the batch file named launchSim.bat in the dataset directory + Protected Overloads Overrides Function launchSim() As Boolean + + Dim proc As Process + Dim startInfo As New ProcessStartInfo() + Dim isFinished As Boolean = False + + startInfo.FileName = Me.Datensatz & Me.DatensatzExtension + 'startInfo.Arguments = "" + startInfo.UseShellExecute = True + startInfo.WindowStyle = ProcessWindowStyle.Normal + startInfo.WorkingDirectory = IO.Path.GetDirectoryName(Me.WorkDir_Current) + 'start + proc = Process.Start(startInfo) + 'wait until finished + Do + isFinished = proc.WaitForExit(100) + System.Windows.Forms.Application.DoEvents() + Loop Until isFinished + + 'close the process + proc.Close() + + End Function + + 'For Multithreading + Protected Overloads Overrides Function launchSim(ByVal Thread_ID As Integer, ByVal Child_ID As Integer) As Boolean + 'pass + End Function + Protected Overloads Overrides Function ThreadFree(ByRef Thread_ID As Integer) As Boolean + 'pass + End Function + Protected Overloads Overrides Function ThreadReady(ByRef Thread_ID As Integer, ByRef SimIsOK As Boolean, ByVal Child_ID As Integer) As Boolean + 'pass + End Function + + ''' + ''' Simulationsergebnis einlesen + ''' + ''' + Protected Overrides Sub SIM_Ergebnis_Lesen() + 'TODO: + + End Sub + +End Class diff --git a/BlueM.Opt/Common/Constants.vb b/BlueM.Opt/Common/Constants.vb index f4af5ad1..9404003b 100644 --- a/BlueM.Opt/Common/Constants.vb +++ b/BlueM.Opt/Common/Constants.vb @@ -41,6 +41,7 @@ Public Module Constants Public Const ANW_TALSIM5 As String = "TALSIM5" Public Const ANW_TESTPROBLEMS As String = "Testproblems" Public Const ANW_TSP As String = "Traveling Salesman" + Public Const ANW_GENERIC As String = "Generic" 'Optimierungsmethoden Public Const METH_PES As String = "PES" diff --git a/BlueM.Opt/Main/Form1.vb b/BlueM.Opt/Main/Form1.vb index afc46a26..14059a13 100644 --- a/BlueM.Opt/Main/Form1.vb +++ b/BlueM.Opt/Main/Form1.vb @@ -1,20 +1,20 @@ 'BlueM.Opt 'Copyright (C) BlueM Dev Group 'Website: -' +' 'This program is free software: you can redistribute it and/or modify 'it under the terms of the GNU General Public License as published by 'the Free Software Foundation, either version 3 of the License, or '(at your option) any later version. -' +' 'This program is distributed in the hope that it will be useful, 'but WITHOUT ANY WARRANTY; without even the implied warranty of 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 'GNU General Public License for more details. -' +' 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . -' +' Imports System.Xml Imports System.Xml.Serialization Imports BlueM.Opt.Common.Constants @@ -145,7 +145,7 @@ Partial Public Class Form1 '--------- 'Liste der Anwendungen in ComboBox schreiben und Anfangseinstellung wählen Me.ComboBox_Anwendung.Items.Clear() - Me.ComboBox_Anwendung.Items.AddRange(New Object() {"", ANW_BLUEM, ANW_SWMM, ANW_TALSIM, ANW_TALSIM5, ANW_TESTPROBLEMS, ANW_TSP}) 'ANW_SMUSI entfernt (#184) + Me.ComboBox_Anwendung.Items.AddRange(New Object() {"", ANW_BLUEM, ANW_SWMM, ANW_TALSIM, ANW_TALSIM5, ANW_GENERIC, ANW_TESTPROBLEMS, ANW_TSP}) 'ANW_SMUSI entfernt (#184) Me.ComboBox_Anwendung.SelectedIndex = 0 'Datensatz @@ -304,8 +304,8 @@ Partial Public Class Form1 If (OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK) Then Try - 'Settings aus Datei laden - Call Me.loadSettings(OpenFileDialog1.FileName) + 'Settings aus Datei laden + Call Me.loadSettings(OpenFileDialog1.FileName) Catch ex As Exception MsgBox("Error while reading settings:" & ex.Message, MsgBoxStyle.Exclamation) @@ -331,13 +331,13 @@ Partial Public Class Form1 Throw New Exception("The loaded settings use a different optimization mode (single-/multiobjective) and are not compatible!") End If - 'Geladene Settings überall neu setzen + 'Geladene Settings überall neu setzen Me.mSettings = settings - Me.EVO_Einstellungen1.setSettings(Me.mSettings) - Me.Hauptdiagramm1.setSettings(Me.mSettings) - If (Not IsNothing(Me.Sim1)) Then - Me.Sim1.setSettings(Me.mSettings) - End If + Me.EVO_Einstellungen1.setSettings(Me.mSettings) + Me.Hauptdiagramm1.setSettings(Me.mSettings) + If (Not IsNothing(Me.Sim1)) Then + Me.Sim1.setSettings(Me.mSettings) + End If End Sub @@ -472,6 +472,10 @@ Partial Public Class Form1 Me.ComboBox_Methode.SelectedIndex = 0 'Button_Start.Enabled = True + Case ANW_GENERIC 'Generic simulation application + 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + Sim1 = New BlueM.Opt.Apps.Generic() + End Select 'Bei Sim-Anwendungen @@ -616,7 +620,7 @@ Partial Public Class Form1 'Alten Datensatz dem Dialog zuweisen If Not IsNothing(Sim1.WorkDir_Original) Then - OpenFileDialog1.InitialDirectory = Sim1.WorkDir_Original + OpenFileDialog1.InitialDirectory = Sim1.WorkDir_Original OpenFileDialog1.FileName = IO.Path.Combine(Sim1.WorkDir_Original, Sim1.Datensatz & "." & Sim1.DatensatzDateiendungen(0)) End If @@ -665,68 +669,68 @@ Partial Public Class Form1 Try - 'Zurücksetzen - '------------ + 'Zurücksetzen + '------------ - 'Tooltip - Me.ToolTip1.SetToolTip(Me.ComboBox_Datensatz, "") + 'Tooltip + Me.ToolTip1.SetToolTip(Me.ComboBox_Datensatz, "") - 'Datensatz-Reset - Me.MenuItem_DatensatzZurücksetzen.Enabled = False + 'Datensatz-Reset + Me.MenuItem_DatensatzZurücksetzen.Enabled = False - 'gewählten Datensatz an Anwendung übergeben - '------------------------------------------ - Select Case Me.Anwendung + 'gewählten Datensatz an Anwendung übergeben + '------------------------------------------ + Select Case Me.Anwendung - Case ANW_TESTPROBLEMS + Case ANW_TESTPROBLEMS - 'Testproblem setzen - Testprobleme1.setTestproblem(selectedDatensatz) + 'Testproblem setzen + Testprobleme1.setTestproblem(selectedDatensatz) - 'Tooltip anzeigen - Me.ToolTip1.SetToolTip(Me.ComboBox_Datensatz, Testprobleme1.TestProblemDescription) + 'Tooltip anzeigen + Me.ToolTip1.SetToolTip(Me.ComboBox_Datensatz, Testprobleme1.TestProblemDescription) - Case Else '(Alle Sim-Anwendungen) + Case Else '(Alle Sim-Anwendungen) - 'Benutzereinstellungen aktualisieren - Try - 'place selected dataset at the end of the list - If (My.Settings.MRUSimDatensaetze.Contains(selectedDatensatz)) Then - My.Settings.MRUSimDatensaetze.Remove(selectedDatensatz) - End If - My.Settings.MRUSimDatensaetze.Add(selectedDatensatz) - 'save user settings - Call My.Settings.Save() - Catch ex As Exception - 'TODO: log My.Settings.MRUSimDatensaetze error - End Try + 'Benutzereinstellungen aktualisieren + Try + 'place selected dataset at the end of the list + If (My.Settings.MRUSimDatensaetze.Contains(selectedDatensatz)) Then + My.Settings.MRUSimDatensaetze.Remove(selectedDatensatz) + End If + My.Settings.MRUSimDatensaetze.Add(selectedDatensatz) + 'save user settings + Call My.Settings.Save() + Catch ex As Exception + 'TODO: log My.Settings.MRUSimDatensaetze error + End Try - 'Datensatz Combobox aktualisieren - Call Me.Datensatz_populateCombo() + 'Datensatz Combobox aktualisieren + Call Me.Datensatz_populateCombo() - 'Auswahl setzen (falls von ausserhalb) - Me.IsInitializing = True - Me.ComboBox_Datensatz.SelectedItem = selectedDatensatz - Me.IsInitializing = False + 'Auswahl setzen (falls von ausserhalb) + Me.IsInitializing = True + Me.ComboBox_Datensatz.SelectedItem = selectedDatensatz + Me.IsInitializing = False - 'Datensatz setzen - Call Sim1.setDatensatz(selectedDatensatz) + 'Datensatz setzen + Call Sim1.setDatensatz(selectedDatensatz) - 'Tooltip anzeigen - Me.ToolTip1.SetToolTip(Me.ComboBox_Datensatz, selectedDatensatz) + 'Tooltip anzeigen + Me.ToolTip1.SetToolTip(Me.ComboBox_Datensatz, selectedDatensatz) - End Select + End Select - 'Methodenauswahl aktivieren und zurücksetzen - '------------------------------------------- - Me.Label_Methode.Enabled = True - Me.ComboBox_Methode.Enabled = True - Me.IsInitializing = True - Me.ComboBox_Methode.SelectedItem = "" - Me.IsInitializing = False + 'Methodenauswahl aktivieren und zurücksetzen + '------------------------------------------- + Me.Label_Methode.Enabled = True + Me.ComboBox_Methode.Enabled = True + Me.IsInitializing = True + Me.ComboBox_Methode.SelectedItem = "" + Me.IsInitializing = False - 'Progress zurücksetzen - Call Me.mProgress.Initialize() + 'Progress zurücksetzen + Call Me.mProgress.Initialize() 'log Common.Log.AddMessage(Common.Log.levels.info, $"Set dataset to {selectedDatensatz}") @@ -1595,7 +1599,7 @@ Partial Public Class Form1 'select solution in the custom plot If (Not IsNothing(Me.customPlot)) Then Call Me.customPlot.showSelectedSolution(ind) - End If + End If End If 'Lösungsdialog nach vorne bringen @@ -1819,30 +1823,30 @@ Partial Public Class Form1 Try - 'Datei-öffnen Dialog anzeigen - Me.OpenFileDialog1.Filter = "Access databases (*.mdb)|*.mdb" - Me.OpenFileDialog1.Title = "Select result DB" - Me.OpenFileDialog1.FileName = "" - Me.OpenFileDialog1.InitialDirectory = Sim1.WorkDir_Original - diagresult = Me.OpenFileDialog1.ShowDialog() + 'Datei-öffnen Dialog anzeigen + Me.OpenFileDialog1.Filter = "Access databases (*.mdb)|*.mdb" + Me.OpenFileDialog1.Title = "Select result DB" + Me.OpenFileDialog1.FileName = "" + Me.OpenFileDialog1.InitialDirectory = Sim1.WorkDir_Original + diagresult = Me.OpenFileDialog1.ShowDialog() - If (diagresult = Windows.Forms.DialogResult.OK) Then + If (diagresult = Windows.Forms.DialogResult.OK) Then - sourceFile = Me.OpenFileDialog1.FileName + sourceFile = Me.OpenFileDialog1.FileName - 'MDBImportDialog - '--------------- - Dim importDialog As New BlueM.Opt.OptResult.MDBImportDialog(Me.mProblem) + 'MDBImportDialog + '--------------- + Dim importDialog As New BlueM.Opt.OptResult.MDBImportDialog(Me.mProblem) - diagresult = importDialog.ShowDialog() + diagresult = importDialog.ShowDialog() - If (diagresult = Windows.Forms.DialogResult.OK) Then + If (diagresult = Windows.Forms.DialogResult.OK) Then - 'Cursor Wait - Cursor = Cursors.WaitCursor + 'Cursor Wait + Cursor = Cursors.WaitCursor - 'Daten einlesen - '============== + 'Daten einlesen + '============== Sim1.OptResult = New OptResult.OptResult(sourceFile, Me.mProblem, createNewMdb:=False) Sim1.OptResult.db_load(sourceFile) @@ -2023,8 +2027,8 @@ Partial Public Class Form1 'Start-Button deaktivieren Me.Button_Start.Enabled = False - 'Simulationen vorbereiten (weil möglicherweise vorher noch nicht geschehen!) - Call Me.Sim1.prepareSimulation() + 'Simulationen vorbereiten (weil möglicherweise vorher noch nicht geschehen!) + Call Me.Sim1.prepareSimulation() End If @@ -2035,8 +2039,8 @@ Partial Public Class Form1 Finally - 'Cursor Default - Cursor = Cursors.Default + 'Cursor Default + Cursor = Cursors.Default End Try @@ -2052,32 +2056,32 @@ Partial Public Class Form1 Try - 'Datei-öffnen Dialog anzeigen - Me.OpenFileDialog1.Filter = "Access-Database (*.mdb)|*.mdb" - Me.OpenFileDialog1.Title = "Result comparison: select optimization result" - Me.OpenFileDialog1.FileName = "" - Me.OpenFileDialog1.InitialDirectory = Sim1.WorkDir_Original - diagresult = Me.OpenFileDialog1.ShowDialog() + 'Datei-öffnen Dialog anzeigen + Me.OpenFileDialog1.Filter = "Access-Database (*.mdb)|*.mdb" + Me.OpenFileDialog1.Title = "Result comparison: select optimization result" + Me.OpenFileDialog1.FileName = "" + Me.OpenFileDialog1.InitialDirectory = Sim1.WorkDir_Original + diagresult = Me.OpenFileDialog1.ShowDialog() - If (diagresult = Windows.Forms.DialogResult.OK) Then + If (diagresult = Windows.Forms.DialogResult.OK) Then - sourceFile = Me.OpenFileDialog1.FileName + sourceFile = Me.OpenFileDialog1.FileName - 'Abfrage - diagresult = MsgBox("Should the optimization parameters of the comparison result be loaded as well?" & eol _ + 'Abfrage + diagresult = MsgBox("Should the optimization parameters of the comparison result be loaded as well?" & eol _ & "(This requires that the optimization parameter definition of both results are identical!)", MsgBoxStyle.YesNo) - If (diagresult = Windows.Forms.DialogResult.Yes) Then - loadOptparameters = True - Else - loadOptparameters = False - End If + If (diagresult = Windows.Forms.DialogResult.Yes) Then + loadOptparameters = True + Else + loadOptparameters = False + End If - 'Cursor Wait - Cursor = Cursors.WaitCursor + 'Cursor Wait + Cursor = Cursors.WaitCursor - 'Daten einlesen - '============== + 'Daten einlesen + '============== Sim1.OptResultRef = New BlueM.Opt.OptResult.OptResult(Me.Sim1.Datensatz, Me.mProblem, createNewMdb:=False) Sim1.OptResultRef.db_load(sourceFile, loadOptparameters) @@ -2137,8 +2141,8 @@ Partial Public Class Form1 'Anzeige in Messagebox MsgBox("Hypervolume difference to comparison result:" & eol _ - & indicatorDiff.ToString() & eol _ - & "(Value was copied to the clipboard)", MsgBoxStyle.Information, "Hypervolume") + & indicatorDiff.ToString() & eol _ + & "(Value was copied to the clipboard)", MsgBoxStyle.Information, "Hypervolume") End If From 60c44844599bda74bf8b50ba1a4f5b1e8aca6fe5 Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 18:41:38 +0200 Subject: [PATCH 2/3] remove obsolete methods --- BlueM.Opt/Apps/Generic.vb | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/BlueM.Opt/Apps/Generic.vb b/BlueM.Opt/Apps/Generic.vb index dccee593..11770b19 100644 --- a/BlueM.Opt/Apps/Generic.vb +++ b/BlueM.Opt/Apps/Generic.vb @@ -1,4 +1,4 @@ -' Copyright (c) BlueM Dev Group +' Copyright (c) BlueM Dev Group ' Website: http://bluemodel.org ' ' All rights reserved. @@ -67,20 +67,6 @@ Public Class Generic 'TODO End Sub - ''' - ''' TODO: this should not be MustOverride in the base class - ''' - Protected Overrides Sub Read_Verzweigungen() - 'pass - End Sub - - ''' - ''' TODO: this should not be MustOverride in the base class - ''' - Protected Overrides Sub Write_Verzweigungen() - 'pass - End Sub - ''' ''' Launch simulation ''' From f61926d9f547704e1d45b11b606aeb4cb382b11c Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 18:43:32 +0200 Subject: [PATCH 3/3] update copyright header --- BlueM.Opt/Apps/Generic.vb | 45 ++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/BlueM.Opt/Apps/Generic.vb b/BlueM.Opt/Apps/Generic.vb index 11770b19..9fd07a56 100644 --- a/BlueM.Opt/Apps/Generic.vb +++ b/BlueM.Opt/Apps/Generic.vb @@ -1,29 +1,20 @@ -' Copyright (c) BlueM Dev Group -' Website: http://bluemodel.org -' -' All rights reserved. -' -' Released under the BSD-2-Clause License: -' -' Redistribution and use in source and binary forms, with or without modification, -' are permitted provided that the following conditions are met: -' -' * Redistributions of source code must retain the above copyright notice, this list -' of conditions and the following disclaimer. -' * Redistributions in binary form must reproduce the above copyright notice, this list -' of conditions and the following disclaimer in the documentation and/or other materials -' provided with the distribution. -' -' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -' EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -' OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -' SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -' OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -' HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -' TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -' EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -'-------------------------------------------------------------------------------------------- +'BlueM.Opt +'Copyright (C) BlueM Dev Group +'Website: +' +'This program is free software: you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation, either version 3 of the License, or +'(at your option) any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'GNU General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program. If not, see . +' Public Class Generic Inherits Sim @@ -45,7 +36,7 @@ Public Class Generic ''' False Public Overrides ReadOnly Property MultithreadingSupported() As Boolean Get - 'TODO: enable multithreading + 'TODO: enable multithreading Return False End Get End Property