<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Timer oder Thread?]]></title><description><![CDATA[<p>Guten Morgen,<br />
ich hab da mal so ne allgemeine Frage!<br />
Wenn ich ein Programm hab, und das soll etwas solange tun, bis ich dem Programm sage jetzt ist gut gewesen, was ist da besser zu benutzten? nen Timer oder nen Thread (in dem eine Schleife läuft) ??</p>
<p>Ich würde sagen nen Thread oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/2032/timer-oder-thread</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 09:24:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/2032.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Aug 2002 06:13:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 06:13:00 GMT]]></title><description><![CDATA[<p>Guten Morgen,<br />
ich hab da mal so ne allgemeine Frage!<br />
Wenn ich ein Programm hab, und das soll etwas solange tun, bis ich dem Programm sage jetzt ist gut gewesen, was ist da besser zu benutzten? nen Timer oder nen Thread (in dem eine Schleife läuft) ??</p>
<p>Ich würde sagen nen Thread oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9281</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Tue, 13 Aug 2002 06:13:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 06:18:00 GMT]]></title><description><![CDATA[<p>Thread</p>
<p>Timer sind nett für einen Refresh von Dialogen o.ä., aber man kann damit keine ernsthafte Synchronisation aufbauen.</p>
<p>Übrigens sollten Schleifen in Threads immer zwischendurch mal die Rechenzeit wieder abgeben... sonst blubbert der Thread mit Volldampf dahin und klaut dem System sämtliche freie Rechenzeit. Zwar kommt der Rest auch weiterhin dran, aber die Systemlast wird ohne Umschaltung deutlich höher.</p>
<p>[ Dieser Beitrag wurde am 13.08.2002 um 08:19 Uhr von <strong>Marc++us</strong> editiert. ]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9282</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Tue, 13 Aug 2002 06:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 06:20:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19933">@Marc</a>++us : danke hatte es mir auch schon fast gedacht!<br />
du sagtest bei schleifen in threads rechenzeit abgeben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Wie bewerkstellige ich das?? Ich weiss wie ich nen Thread erstelle, aber davon hab ich noch nix gehört..wäre um ne erklärung dankbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/9283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9283</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Tue, 13 Aug 2002 06:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 06:30:00 GMT]]></title><description><![CDATA[<p><strong>Anleitung (so erstelle ich einen Thread)</strong>:</p>
<p>1. Erstelle eine Klasse abgeleitet von WinThread<br />
2. Erstelle folgende &quot;public´s&quot;</p>
<pre><code class="language-cpp">virtual int Run();
CHauptDlg* m_dialogvar;
CHauptDlg* m_pOwner;
void SetOwner(CHauptDlg* pOwner) { m_pOwner = pOwner; };
</code></pre>
<p>3. Includiere die Hauptklasse in der Threadklasse</p>
<pre><code class="language-cpp">#include &quot;HauptDlg.h&quot;;
</code></pre>
<p>4. (Hauptklasse) Nimm die Threadklasse auf</p>
<pre><code class="language-cpp">class CDeinThread;
</code></pre>
<p>5. Erstelle nen (?pointer) zum Thread</p>
<pre><code class="language-cpp">CDeinThread* m_xDisplayThread;
</code></pre>
<p>6. Nun kannst du den Thread wie folgt aufrufen</p>
<pre><code class="language-cpp">m_xDisplayThread = (CDeinThread*)
AfxBeginThread(RUNTIME_CLASS(CDeinThread), NULL,
    0, CREATE_SUSPENDED);

m_xDisplayThread-&gt;SetOwner(this);
m_xDisplayThread-&gt;ResumeThread();
</code></pre>
<p>So das sollte es gewesen sein..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9284</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Tue, 13 Aug 2002 06:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 06:32:00 GMT]]></title><description><![CDATA[<p>Wenn Marc++us noch was zur Rechzeitfreigabe gepostet hat, werd ich diesen Thread mal in die FAQ packen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9285</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Tue, 13 Aug 2002 06:32:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 07:09:00 GMT]]></title><description><![CDATA[<p>Aber Du setzt mich jetzt nicht unter Druck, oder?</p>
<p>Kurzer Exkurs:</p>
<p>Wenn man in einem Thread Schleifen der folgenden Form hat:</p>
<pre><code class="language-cpp">while (anything())
{
   do_something();
}
</code></pre>
<p>Passiert ein unschöner Effekt: der Thread gelangt nie in den &quot;Ready-State&quot; und das System teilt ihm daher alle noch freie Rechenzeit zu. Die Systemlast knallt hoch auf 100%.</p>
<p>Das kann notwendig sein, wenn der Thread wirklich mit Hochdruck etwas erledigen muß.</p>
<p>Oftmals ist dies aber auch eine Fehlkonstruktion, weil die Schleife auf etwas warten oder die Abfrage gar nicht so oft ausführen muß. In solchen Fällen wirkt z.B. ein WaitForSingleObject</p>
<pre><code class="language-cpp">while (anything())
{
   do_something();
   // warte nun auf ein Synchronisationsobjekt
   WaitForSingleObject(...);
}
</code></pre>
<p>oder ein Sleep</p>
<pre><code class="language-cpp">while (anything())
{
   do_something();
   // setzt Thread auf Ready
   Sleep(0);
}
</code></pre>
<p>Wunder. Einfach mal ausprobieren und die Rechenlast vergleichen. Die Lösung mit WaitForSingleObject ist etwas komplizierter, da man sich hier schon überlegen muß worauf man wartet - aber selbst wenn man einfach eine for-Schleife über 100000 Datensätze drüberrutschen läßt in dem Thread, ist so ein kleines Sleep an der richtigen Stelle eine Wohltat für die Systemlast.</p>
<p>Ich empfehle an dieser Stelle einige Experimente, um einen Eindruck vom Unterschied zu bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9286</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Tue, 13 Aug 2002 07:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 07:17:00 GMT]]></title><description><![CDATA[<p>Apropos Rechenzeit abgeben:</p>
<p>Während man in in einer Schleife auf die Beendigung eines Threads wartet, der mit recht geringer Priorität laufen soll, kann man das Abfragen des Beendigungs-Events mit einem TimeOut versehen, etwa folgendermassen:</p>
<pre><code class="language-cpp">while( WaitForSingleObject( hEventThreadBeenden, 10) == WAIT_TIMEOUT)
{
  // do something
}
</code></pre>
<p>Wenn die Priorität des Threads manuell mit SetPriority auf unter 'Normal' gestellt wurde, wüßte ich allerdings nicht, wozu man in Zählschleifen oder so noch Rechenzeit abgeben sollte. Dies macht das System auf Basis seiner Zeitscheibenautomatik von selber.<br />
Außerdem hat ein Thread innerhalb eines Prozesses immer eine geringere Priorität als der Prozess.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9287</guid><dc:creator><![CDATA[RenéG]]></dc:creator><pubDate>Tue, 13 Aug 2002 07:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 07:18:00 GMT]]></title><description><![CDATA[<p>Alles Klar...<br />
ne ich setzt dich jetzt nicht unter Druck.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/9288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9288</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Tue, 13 Aug 2002 07:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 07:46:00 GMT]]></title><description><![CDATA[<p>Schon richtig, die Systemlast geht hoch auf 100%, doch da ich den Thread meist in der Priorität tiefer stufe, übernimmt das System automatisch, wann es den Thread kurzzeitig abschaltet.</p>
<p>Sleep ist vielleicht für DB-Abfragen ganz gut, aber anderes Beispiel:</p>
<pre><code class="language-cpp">for( int i=0; i&lt;100000; i++)
{
  a += abs(b); // Funktion mit wenig Rechenzeit
}
</code></pre>
<p>Normal braucht diese Schleife ein paar Millisekunden. Inklusive eines Sleeps geht das schon mal auf ein paar Sekunden hoch. Da lasse ich doch das System lieber ein paar Millisekunden warten, statt mehrere Sekunden auf die Lösung der Schleife zu warten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9289</guid><dc:creator><![CDATA[RenéG]]></dc:creator><pubDate>Tue, 13 Aug 2002 07:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Tue, 13 Aug 2002 12:56:00 GMT]]></title><description><![CDATA[<p>RenèG:</p>
<p>Ich denke das Marc++us nicht das verwenden von Sleep(0) in einer Rechenschleife meinte sondern in der Warteschleife.<br />
In manchen Situationen hilfte es schon.<br />
Habe ein Programm welches 20 Threads hat.<br />
Jeder einzelne wartet auf einen Netzwerkconnect und empfängt eine Soundstream.<br />
Im Thread wird dann eine Spracherkennung durchgeführt und das Cleartextergebniss wieder zurückgesendet.<br />
Hier hat an einigen Stellen ein abgeben des Zeitfenstern wunder gewirkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9290</guid><dc:creator><![CDATA[Unix-Tom]]></dc:creator><pubDate>Tue, 13 Aug 2002 12:56:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Wed, 04 Sep 2002 13:29:00 GMT]]></title><description><![CDATA[<p>Mhhh, also ich hols jetzt nochmal wieder auf<br />
Ich check mit dem Thread und ner verschleiften schleife <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ob eine datei aktuallsiert worden ist, das ganze sieht so aus:</p>
<pre><code class="language-cpp">CString check,stat;
while(m_pOwner-&gt;checker != TRUE)
{
//setlocale(LC_ALL, &quot;German&quot;);
    CFileStatus status;
    CFile file;
    CString pfad;
    pfad = m_pOwner-&gt;setup.m_pfad;       
    CTime filetime;
    if(file.GetStatus(pfad,status))
    {
        filetime = status.m_mtime;
        stat = filetime.Format(&quot;%d.%m.%Y - %H:%M:%S&quot;);
    }
    if(check != stat)
    {
        m_pOwner-&gt;m_log.SetCurSel(m_pOwner-&gt;m_log.AddString(m_pOwner-&gt;zeit +(&quot; : &quot;)+stat));
        check = stat;
    }

    Sleep(0);
}
</code></pre>
<p>So nun ist die Systemauslastung aber dann auf 100 (aber es läuft anscheind noch alles gut)<br />
So das kanns ja aber nicht sein.... Und es von grosser Wichtigkeit das das Programm diese Datei ständig Prüft, das hört eigentlich nie auf...<br />
Also??<br />
Was kann ich tun?? Hat jemand Ideen??</p>
<p><strong>der code steht in einem stinknormalen thread</strong> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>[ Dieser Beitrag wurde am 04.09.2002 um 15:30 Uhr von <strong>C-O-M-M-A-N-D-E-R</strong> editiert. ]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9291</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Wed, 04 Sep 2002 13:29:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Thu, 05 Sep 2002 06:53:00 GMT]]></title><description><![CDATA[<p>Hallo Commader,</p>
<p>also für diesen Zweck wäre meiner Meinung nach auch ein Timer gegangen. Aber ein Thread ist natürlich schon eleganter.</p>
<p>Du prüfst deine Datei im Sekundenbereich. Also nehme ich mal an, dass es sooo dermaßen zeitkritisch nicht ist. Was hindert dich daran mal</p>
<pre><code class="language-cpp">Sleep(500)
</code></pre>
<p>statt</p>
<pre><code class="language-cpp">Sleep(0)
</code></pre>
<p>einzubauen um zu sehen, was dann mit der Auslastung passiert?</p>
<p>Nur so als Idee...</p>
<p>Grüße, Volle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9292</guid><dc:creator><![CDATA[Volle]]></dc:creator><pubDate>Thu, 05 Sep 2002 06:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Thu, 05 Sep 2002 07:07:00 GMT]]></title><description><![CDATA[<p>Super!!! danke Volle.... das hat meine Systemauslastung enorm runtergebracht!!</p>
<p>Erst 100% und nun nur nopch 4-6 % *freu*</p>
<p>spitzenmässig....</p>
<p>thx<br />
commander</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9293</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Thu, 05 Sep 2002 07:07:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Thu, 05 Sep 2002 07:56:00 GMT]]></title><description><![CDATA[<p>*mitfreu* + *AufDenLorbeerenAusruh*</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Grüße, Volle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9294</guid><dc:creator><![CDATA[Volle]]></dc:creator><pubDate>Thu, 05 Sep 2002 07:56:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Thu, 05 Sep 2002 09:58:00 GMT]]></title><description><![CDATA[<p>Warum überwachst du nicht den Ordner. Wenn sich etwas ändert dann erst ob sich das File geändert hat</p>
<p>FindFirstChangeNotification</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9295</guid><dc:creator><![CDATA[Unix-Tom]]></dc:creator><pubDate>Thu, 05 Sep 2002 09:58:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Thu, 05 Sep 2002 11:24:00 GMT]]></title><description><![CDATA[<p>Wieso soll ich den Ordner überwachen??<br />
Ist doch einfacher wenn ich direkt die File überwache!! Das funktioniert auch schon einwandfrei, mein Problem ist halt nur noch das einlesen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/9296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9296</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Thu, 05 Sep 2002 11:24:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Thu, 05 Sep 2002 12:21:00 GMT]]></title><description><![CDATA[<p>Das Überwachen muß du aber in einer SChleife realisieren.<br />
Das Überwachen nicht da dir Windows eine Message sendet wenn sich was ändert.<br />
Somit braucht dein Programme in diesem Moment 0 Resourcen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9297</guid><dc:creator><![CDATA[Unix-Tom]]></dc:creator><pubDate>Thu, 05 Sep 2002 12:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Thu, 05 Sep 2002 12:59:00 GMT]]></title><description><![CDATA[<p>Mhhhh wäre ne Überlegung wert.... nicht schlecht..vielen Dank..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/9298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/9298</guid><dc:creator><![CDATA[C-O-M-M-A-N-D-E-R]]></dc:creator><pubDate>Thu, 05 Sep 2002 12:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Fri, 19 Sep 2003 07:21:54 GMT]]></title><description><![CDATA[<p>Das Thema ist zwar schon uralt, aber trotzdem noch eine Frage:</p>
<p>Ich haben eine Thread-Klasse von CWinThread abgeleitet (habe also MeinThread.h und MeinThread.cpp) und möchte die jetzt in CAppView einbinden.<br />
Dazu habe ich in der MeinThread.h meine AppView.h includiert (um einen Member-Pointer auf die CAppView anzulegen.</p>
<p>Nun muss ich ja in meine AppView die MeinThread.h includieren, um da wiederum einen Zeiger auf meinen Thread einzubauen.</p>
<p>Danach erhalte ich aber Fehlermeldungen angro - was sicher an dem gegenseitigen includieren liegt oder?<br />
Wie löse ich dieses Problem?</p>
<p>Danke und Gruß<br />
Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/356540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/356540</guid><dc:creator><![CDATA[MuehBln]]></dc:creator><pubDate>Fri, 19 Sep 2003 07:21:54 GMT</pubDate></item><item><title><![CDATA[Reply to Timer oder Thread? on Fri, 19 Sep 2003 09:36:38 GMT]]></title><description><![CDATA[<p>Hi,<br />
ja das mit dem gegenseitigen includieren ist machnmal zum verzweifeln.</p>
<p>Versuch mal folgendes:<br />
Includiere in Deine AppView NICHT MeinThread.h, sondern mach in AppView.h eine Vorwärtsdeklaration. Dazu brauchst Du nur zu schreiben:</p>
<p><a href="//AppView.h">//AppView.h</a></p>
<p>class MeinThread;</p>
<p>class AppView<br />
{<br />
//Methoden und Variablen<br />
.......<br />
......</p>
<p>}</p>
<p>Jetzt kennt AppView Deine Thread-Klasse, ohne dass Du sie includieren musst! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>(Falls es nicht geht, mach es umgekehrt. Mach eine Vorwärtsdeklaration der Klasse AppView in MeinThread.h)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/356616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/356616</guid><dc:creator><![CDATA[Cosmixx]]></dc:creator><pubDate>Fri, 19 Sep 2003 09:36:38 GMT</pubDate></item></channel></rss>